[英]rails 3 javascript not executed despite a text/javascript content-type in response
[英]Rails 3 prototype render :update response has text/html content-type
我正在尝试使用原型和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/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"
,将其包装在带有format.js
的respond_to
块中,并将其重写为js.erb
文件,但是所有仍然返回text/html
作为响应头中的内容类型。
更新我有点弄清楚如何通过在render
之前在控制器中添加headers["Content-Type"] = "text/javascript; charset=utf-8"
来获得预期的行为,但这看起来并不是最好的如果我必须在每个RJS实例之前明确添加它,那么这样做的方法。 如果有人能想出一个,我想要一个更清洁的解决方案。
更新事实证明,在将content-type设置为text / html的每个请求之前,我们运行了一个before_filter
。 我删除了这个,并且能够删除我添加的所有headers["Content-Type"]
代码。 它在我的开发环境中工作,但在我们的测试验证环境中没有。 结果是我们在那里缓存了旧资产,因此验证运行原型1.6.1,而我的本地开发环境有1.7.0。 这导致rails.js
无法在验证中编译,因此所有请求都有一个Accepts: text/html
而不是text/javascript
。 刷新缓存加载了较新版本的原型并修复了问题。
事实证明,我们在每个将content-type设置为text / html的请求之前运行了一个before_filter。 我删除了它,它没有下面的黑客工作。
但是如果你需要一个解决方法,这就是我在下面做的。
我唯一想要做的就是在render :update
之前添加headers["Content-Type"] = "text/javascript; charset=utf-8"
render :update
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
的代码中的每个地方添加它render :update
被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.