Rails 3 原型渲染:更新响应具有 text/html 内容类型
Posted
技术标签:
【中文标题】Rails 3 原型渲染:更新响应具有 text/html 内容类型【英文标题】:Rails 3 prototype render :update response has text/html content-type 【发布时间】:2012-02-22 15:06:33 【问题描述】:我正在尝试让一些用原型和 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,但现在无法进行更改。
更新:
我尝试了其他几种编写代码的方法,包括在render
中指定:content_type => "text/javascript"
,用format.js
将其包装在respond_to
块中,并将其重写为js.erb
文件,但所有内容仍然返回text/html
作为响应头中的内容类型。
更新
我想出了如何通过在render
之前的控制器中添加headers["Content-Type"] = "text/javascript; charset=utf-8"
来获得预期的行为,但是如果我必须在每个RJS 实例之前显式添加它,这似乎并不是最好的方法。如果有人能想出一个更清洁的解决方案,我想要一个。
更新
事实证明,在每个将内容类型设置为 text/html 的请求之前,我们都有一个 before_filter
运行。我删除了这个,并且能够删除我添加的所有headers["Content-Type"]
代码。它适用于我的开发环境,但不适用于我们的测试验证环境。结果证明我们在那里缓存了旧资产,所以验证运行原型 1.6.1,而我的本地开发环境有 1.7.0。这导致rails.js
无法在验证中编译,因此所有请求都有Accepts: text/html
而不是text/javascript
。刷新该缓存加载了较新版本的原型并修复了问题。
【问题讨论】:
【参考方案1】:事实证明,我们有一个 before_filter 在每次请求将内容类型设置为 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
的每个地方添加它。
【讨论】:
我将此标记为最佳答案。如果有人有我可以验证的更简洁的解决方案,我会很乐意标记他们的。 原来它在我们的测试验证环境中不起作用,只在我的本地开发环境中,所以没有标记最佳答案。仍然需要一种方法来解决它 现在已修复。原来这不是代码,而是在验证中缓存的旧prototype.js
资产。刷新允许rails.js
正确编译,客户端开始请求text/javascript
而不是text/html
以上是关于Rails 3 原型渲染:更新响应具有 text/html 内容类型的主要内容,如果未能解决你的问题,请参考以下文章