我正在尝试让一些使用原型(prototype)和 Rails 2.3.11 编写的 RJS 代码在 Rails 3.2.1 中工作
我有 prototype-rails
gem ,所以 render :update do |page|
有效,我正在使用 :remote => true
的表单向 Controller 发送 ajax 请求,javascript 看起来生成正常。
但是,响应 header 中的内容类型是 text/html; charset=utf-8
, 应该是 text/javascript
.
在 Controller 中我这样调用它:
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 具有原型(prototype)工作。 jQuery 将来可能会被使用,但现在进行更改不是一种选择。
更新:
我尝试了其他几种编写代码的方法,包括指定 :content_type => "text/javascript"
在 render
,将其包装在 respond_to
中用 format.js
block , 并将其重写为 js.erb
文件,但所有文件仍以 text/html
返回作为响应 header 中的内容类型。
更新
我想出了如何通过添加 headers["Content-Type"] = "text/javascript; charset=utf-8"
来获得预期的行为。在 Controller 之前 render
,但如果我必须在每个 RJS 实例之前显式添加它,这似乎并不是最好的方法。如果有人能想出一个更清洁的解决方案,我想要一个。
更新
原来我们有一个 before_filter
在将内容类型设置为文本/html 的每个请求之前运行。我删除了它,并且能够删除所有 headers["Content-Type"]
我添加的代码。它在我的开发环境中有效,但在我们的测试验证环境中无效。结果是我们在那里缓存了旧 Assets ,所以验证运行的原型(prototype)是 1.6.1,而我的本地开发环境是 1.7.0。这导致了rails.js
不在验证中编译,所以所有请求都有一个 Accepts: text/html
而不是 text/javascript
.刷新缓存加载了较新版本的原型(prototype)并解决了问题。
最佳答案
事实证明,我们有一个 before_filter 在每个将内容类型设置为 text/html 的请求之前运行。我删除了它,它在没有下面的 hack 的情况下工作。
但如果您需要解决方法,请引用我在下面所做的。
我唯一想出的办法是在 render 之前添加
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
的每个地方添加它。
关于javascript - Rails 3 原型(prototype)渲染 :update response has text/html content-type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070350/