【问题标题】:Rails JS Response, render both status and template?Rails JS响应,同时呈现状态和模板?
【发布时间】:2012-03-24 13:33:16
【问题描述】:

在我当前的 rails 应用程序中,我正在使用 ajax uploader 库,它要求您使用 json {success:true} 进行响应,以表明文件已成功上传。

在我的应用程序中,文件是图像,上传后我想将其添加到页面中。通常我会这样做:

respond_to do |format|
  format.html { redirect_to @resource, :notice => 'Created.' }
  format.js
end

在上面的示例中,我的 JS 响应将呈现适当的模板,例如 create.js.erb,它可能会显示类似...

$('#resources').append('<%= escape_javascript( render '@resource' ) %>');

这就是我过去所做的事情,例如 Ajax cmets 等。现在,要让上传者工作,我的respond_to 块当前执行以下操作:

format.js { render :json => { :success => true } }

这使上传器工作,但似乎阻止我像通常使用 Ajax 响应一样向页面添加渲染的部分。

我的问题是,有没有办法同时实现这两者?如果没有,在成功创建渲染对象后,您将如何使用渲染对象填充页面?

【问题讨论】:

    标签: ruby-on-rails ajax templates rendering partial


    【解决方案1】:

    您不能直接从控制器或使用视图模板同时进行。看起来 ajax 上传者期待一个可以解析为 JSON 的响应,因此使用模板添加任何其他响应(这意味着不执行 format.js { render :json =&gt; { :success =&gt; true }})不会将 JSON 作为响应正文发回。

    查看插件的source,您可以看到您可以定义一个运行onComplete 的方法,该方法将为您提供JSON 响应。

    这是未经测试的,但应该让你接近。所以你如果扩展你的 JSON 响应像

    format.js do
      partial = render_to_string @resource
      render :json => { :success => true, :partial => partial }
    end
    

    然后在设置 ajax 上传器时在页面上的 javascript 中添加回调

    var uploader = new qq.FileUploader({
      element: document.getElementById('file-uploader'),
      action: '/upload',
      onComplete: function(id, fileName, responseJSON) {
        $('#resources').append(responseJSON.partial);
      }
    }); 
    

    【讨论】:

    • 这个想法行得通。我不知道render_to_string,但在测试中我发现我也可以在回调中使用.getScript 来检索部分。你的方法更干净。谢谢!
    • 一个注释...默认情况下escape_javascript 对控制器不可用,也不需要它,因为render :json 方法无论如何都会这样做。
    • 酷,很高兴它有帮助。 escape_javascript 在那里不起作用是有道理的,不知道我在想什么。感谢您对答案的反馈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多