Rails 3原型渲染:update响应具有text/html内容类型

4
我正在尝试将使用原型和Rails 2.3.11编写的一些RJS代码在Rails 3.2.1中运行。 我已经使用了prototype-rails宝石,因此render :update do |page|有效。我正在使用一个带有:remote => true的表单发送ajax请求到控制器,并且javascript看起来生成正确。 然而,响应头中的内容类型是text/html; charset=utf-8,它应该是text/javascript。 在控制器中,我像这样调用它:
render :update do |page|
    if @step.errors.empty?
        page.redirect_to how_to_path(@article.id)
    else
        page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true}
    end
end

看起来生成window.location.href...Element.update...代码没有问题,但由于内容类型不正确而无法执行。
我是否有做错的事情会导致这种情况? 我需要一个能使rjs与原型一起使用的解决方案。 未来可能会使用jQuery,但现在不能进行更改。
更新:我尝试了几种其他编写代码的方法,包括在render中指定:content_type => "text/javascript",用respond_to块和format.js包装它,并将其重写为js.erb文件,但仍然返回响应头中的text/html作为内容类型。
更新:我通过在控制器中添加headers["Content-Type"] = "text/javascript; charset=utf-8"来实现预期的行为,但是如果我必须在每个RJS实例之前显式添加它,则这似乎并不是最佳方法。 如果有人能想出更简洁的解决方案,我希望能得到帮助。
更新:原来我们在每个请求之前都运行了一个before_filter,该过滤器将内容类型设置为text/html。我删除了此内容后,就能够删除我添加的所有headers["Content-Type"]代码。 它在我的开发环境中运行良好,但在我们的测试验证环境中却没有。 结果是我们在那里缓存了旧的资源,因此验证正在运行原型1.6.1,而我的本地开发环境则使用1.7.0。 这导致验证中未编译rails.js,因此所有请求都具有Accepts: text/html而不是text/javascript。 刷新该缓存加载了更新的原型版本并解决了问题。
1个回答

1
原来我们有一个 before_filter 在每个请求之前设置 content-type 为 text/html。我把它移除了,然后就不需要下面的 hack 了。
但如果你需要一个解决方法,下面是我所做的。
唯一让这个工作的事情是在 render :update 之前添加 headers["Content-Type"] = "text/javascript; charset=utf-8"。
headers["Content-Type"] = "text/javascript; charset=utf-8"
render :update do |page|
  if @step.errors.empty?
    page.redirect_to how_to_path(@article.id)
  else
    page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true}
  end
end

不幸的是,我不得不在代码中每个调用RJS render :update的地方都添加它。


我将此标记为最佳答案。如果有人有更干净的解决方案,我会很乐意标记他们的答案。 - keithepley
结果在我们的测试验证环境中无法工作,只能在我的本地开发环境中工作,因此取消最佳答案标记。仍然需要一种修复它的方法。 - keithepley
现在已经修复了。原来问题不是代码,而是一个旧的prototype.js资源在验证中被缓存了。刷新后,rails.js能够正确编译,并且客户端开始请求text/javascript而不是text/html - keithepley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接