我正在尝试让一些用原型和 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...
and Element.update...
代码正常,但由于内容类型错误而未执行。
我可能做错了什么会导致这种情况吗?我需要一个能够使 rjs 与原型一起工作的解决方案。将来可能会使用 jQuery,但现在无法进行更改。
update:我尝试了一些其他编写代码的方法,包括指定:content_type => "text/javascript"
in render
,将其包裹在respond_to
块与format.js
,并将其重写为js.erb
文件,但仍然全部返回text/html
作为响应标头中的内容类型。
update我想出了如何通过添加来获得预期的行为headers["Content-Type"] = "text/javascript; charset=utf-8"
在控制器之前render
,但是如果我必须在每个 RJS 实例之前显式添加它,那么这似乎并不是最好的方法。如果有人能想出一个更干净的解决方案,我想要一个。
update事实证明我们有一个before_filter
在将内容类型设置为 text/html 的每个请求之前运行。我删除了这个,并且能够删除所有headers["Content-Type"]
我添加的代码。它在我的开发环境中有效,但在我们的测试验证环境中无效。事实证明,我们在那里缓存了旧资源,因此验证运行的是原型 1.6.1,而我的本地开发环境是 1.7.0。这导致了rails.js
不在验证中编译,因此所有请求都有一个Accepts: text/html
代替text/javascript
。刷新缓存加载了新版本的原型并解决了问题。