我试图让一些用原型和 Rails 2.3.11 编写的 RJS 代码在 Rails 3.2.1 中工作
我有prototype-rails
gem,所以render :update do |page|
工作正常,我正在使用一个:remote => true
向控制器发送 ajax 请求的表单,并且 javascript 看起来生成正常。
但是,响应标头中的 content-type 是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,但现在无法进行更改。
更新:
我尝试了其他几种编写代码的方法,包括指定:content_type => "text/javascript"
in render
,用 将其包装在一个respond_to
块中format.js
,并将其重写为js.erb
文件,但所有这些方法仍然text/html
作为响应标头中的内容类型返回。
更新
我有点想出如何通过headers["Content-Type"] = "text/javascript; charset=utf-8"
在控制器之前添加来获得预期的行为render
,但是如果我必须在每个 RJS 实例之前显式添加它,这似乎并不是最好的方法。如果有人能想出一个更清洁的解决方案,我想要一个。
更新
事实证明,before_filter
在每个将内容类型设置为 text/html 的请求之前,我们都有一个运行。我删除了这个,并且能够删除headers["Content-Type"]
我添加的所有代码。它适用于我的开发环境,但不适用于我们的测试验证环境。结果证明我们在那里缓存了旧资产,所以验证运行原型 1.6.1,而我的本地开发环境有 1.7.0。这导致rails.js
无法在验证中编译,因此所有请求都有一个Accepts: text/html
而不是text/javascript
. 刷新该缓存加载了较新版本的原型并修复了问题。