4

我试图让一些用原型和 Rails 2.3.11 编写的 RJS 代码在 Rails 3.2.1 中工作

我有prototype-railsgem,所以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. 刷新该缓存加载了较新版本的原型并修复了问题。

4

1 回答 1

1

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

但是,如果您需要解决方法,这就是我在下面所做的。

我想完成这项工作的唯一一件事就是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

不幸的是,我不得不在render :update调用 RJS 的代码中的每个地方添加它。

于 2012-04-02T21:14:31.983 回答