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 内容类型的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 中,如何渲染 JSON?

使用rails在javascript响应中渲染Haml文件

Rails - 格式和渲染 - 它们是如何工作的?

无法在 Rails 中更新动作文本富文本

Rails 以不同的格式渲染动作

vue数组响应式原理