javascript - Rails 3 原型(prototype)渲染 :update response has text/html content-type

标签 javascript ruby-on-rails-3 prototypejs content-type ruby-on-rails-3.2

我正在尝试让一些使用原型(prototype)和 Rails 2.3.11 编写的 RJS 代码在 Rails 3.2.1 中工作

我有 prototype-rails gem ,所以 render :update do |page|有效,我正在使用 :remote => true 的表单向 Controller 发送 ajax 请求,javascript 看起来生成正常。

但是,响应 header 中的内容类型是 text/html; charset=utf-8 , 应该是 text/javascript .

在 Controller 中我这样调用它:

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 具有原型(prototype)工作。 jQuery 将来可能会被使用,但现在进行更改不是一种选择。

更新: 我尝试了其他几种编写代码的方法,包括指定 :content_type => "text/javascript"render ,将其包装在 respond_to 中用 format.js block , 并将其重写为 js.erb文件,但所有文件仍以 text/html 返回作为响应 header 中的内容类型。

更新 我想出了如何通过添加 headers["Content-Type"] = "text/javascript; charset=utf-8" 来获得预期的行为。在 Controller 之前 render ,但如果我必须在每个 RJS 实例之前显式添加它,这似乎并不是最好的方法。如果有人能想出一个更清洁的解决方案,我想要一个。

更新 原来我们有一个 before_filter在将内容类型设置为文本/html 的每个请求之前运行。我删除了它,并且能够删除所有 headers["Content-Type"]我添加的代码。它在我的开发环境中有效,但在我们的测试验证环境中无效。结果是我们在那里缓存了旧 Assets ,所以验证运行的原型(prototype)是 1.6.1,而我的本地开发环境是 1.7.0。这导致了rails.js不在验证中编译,所以所有请求都有一个 Accepts: text/html而不是 text/javascript .刷新缓存加载了较新版本的原型(prototype)并解决了问题。

最佳答案

事实证明,我们有一个 before_filter 在每个将内容类型设置为 text/html 的请求之前运行。我删除了它,它在没有下面的 hack 的情况下工作。

但如果您需要解决方法,请引用我在下面所做的。

我唯一想出的办法是在 render 之前添加 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 的每个地方添加它。

关于javascript - Rails 3 原型(prototype)渲染 :update response has text/html content-type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9070350/

相关文章:

javascript - 使用 Prototype 在 Safari 上的图像宽度

javascript - 嵌套指令 - 无法将参数从 Angularjs 中的子指令传递给 Controller ​​方法

ruby-on-rails-3 - 如何在rails3中渲染编辑 View 并发布Flash消息

javascript - Vue SPA - 检查用户是否经过身份验证,如果没有则重定向到登录

ruby-on-rails - Ruby on Rails Instagram Gem 点赞和评论计数无法正常工作

ruby-on-rails-3 - Spork、RSpec 和 database_cleaner 破坏开发数据库

javascript - 为焦点创建事件观察器?

javascript - 子元素触发的鼠标悬停事件 - 如何停止?

javascript - 处理不同对象上的 "mousedown"事件

javascript - 使用 Javascript/jQuery 查找相似的 SELECT 选项