2011-01-30 44 views
1

我正在使用基于JQuery的文件上传插件将图像文件直接上传到S3。该插件工作正常,在模型中实现的上传代码也很实用。我的问题是文件完成其快速旅程后会发生什么。Javascript中的Rails标签呈现

该插件接受一个回调'onLoad',该回调在上传完成后执行。为了回调起作用,所需要的只是一个Javascript函数,你知道,它会做任何事情。好的。我想要的是回调加载一个部分,将替换上传形式与图像的显示。因此,这里是我如何指定回调:

onLoad: function (evt, files, index, xhr, handler) { 
    (document).ready(function($) { 
     $('.container').html('<%= escape_javascript(render :partial => "pictures/picture_editor", :locals => { :picture => @picture }, :layout => false) %>')}); 
} 

那么 - 我想要的,当然,是针对“渲染”标签前的回调渲染,但是这确实是什么发生。加载页面后,立即出现错误,因为Rails正在尝试呈现该标记,而不等待执行Javascript或其他任何内容 - Rails在视图中看到标记,并且想要呈现它。我试着研究一个答案,我觉得我必须丢失的东西痛苦显而易见 - 但我怎么加载部分从jQuery回调,如果我不能在视图中指定渲染标记?我错过了什么?

如果答案非常明显,我很抱歉。

+0

此javascript是否包含在您的js文件或rjs tempalte中? – raidfive 2011-01-30 04:47:58

+0

它在部分被模板加载,但我想把它放在一个js文件中就没有问题。 – Lockjaw 2011-01-30 05:06:38

回答

1

部分不能单独呈现(例如在ajax响应中)。我想一个办法将修复它,假设你仍然需要部分为部分(即你需要使它与其他网页的一部分),为:

  1. 创建一个PicturesController#picture_editor动作,只是呈现局部没有布局。
  2. 在JavaScript事件处理程序中,使用jQuery的“加载”函数将该操作加载到div中。

像这样在PicturesController:

def picture_editor 
    @picture = Picture.find(params[:id]) 
    render :partial => 'picture_editor', :picture => @picture :layout => false 
end 

并且这在JavaScript(在.html.erb或.js.erb文件,以便它将被红宝石进行处理;在不生的.js ):

$('.container').load('<%= url_for(:controller => 'Pictures', :action => 'picture_editor' %>')});