Rails默认为";text/javascript“;内容类型,用于响应使用表单_为
我使用的是Rails 4.1.1和Ruby 2.1.2p95。我使用Slim作为我的HTML模板语言(类似于HAML)。我正在使用Thin作为我的机架服务器 我正在尝试制作一个完全AJAX的应用程序(我的要求之一是我可能不会重新加载页面) 问题 我有一个用户注册页面,如下所示:Rails默认为";text/javascript“;内容类型,用于响应使用表单_为,javascript,ruby-on-rails,ajax,content-type,unobtrusive-javascript,Javascript,Ruby On Rails,Ajax,Content Type,Unobtrusive Javascript,我使用的是Rails 4.1.1和Ruby 2.1.2p95。我使用Slim作为我的HTML模板语言(类似于HAML)。我正在使用Thin作为我的机架服务器 我正在尝试制作一个完全AJAX的应用程序(我的要求之一是我可能不会重新加载页面) 问题 我有一个用户注册页面,如下所示: = form_for( User.new, url: user_path, remote: true ) do |f| = f.label :username = f.text_field :username,
= form_for( User.new, url: user_path, remote: true ) do |f|
= f.label :username
= f.text_field :username, label: true
= f.label :password
= f.password_field :password, label: true
= f.label :password_confirmation
= f.password_field :password_confirmation, label: true
= f.submit
我有一个UsersController操作,如下所示(在本例中):
我有一个类似这样的响应处理程序(这其实并不重要-只需说成功处理程序不会启动,错误处理程序会启动):
Rails发回一个内容类型标题设置为“text/javascript”的响应。因此,浏览器尝试将响应解析为JavaScript,这当然会失败,并导致AJAX响应的错误事件而不是成功事件
我不喜欢的解决方案
我可以通过使用Rails显式地解决这个问题,或者通过在调用的形式_中指定请求URL格式:
= form_for( User.new, url: user_path( format: :html ), remote: true ) do |f|
...
或者通过在控制器操作中显式指定标头:
def create
render html: "PRETEND A USER WAS CREATED", content_type: :html
end
但我很难过,我甚至不得不这么做。没有人要求Rails返回javascript响应,这在大多数情况下显然是正确的,但在使用他们不引人注目的javascript工具时则不然
我很想了解这里发生了什么,以及是否有任何方法可以配置我的应用程序,这样我就不需要编写这些额外的变通方法
提前感谢好朋友。好吧,当我意识到这是一个令人费解的间歇性问题时,我应该猜到这部分是缓存问题。基本上,解决方案只是强制Rails将请求视为HTML请求,但如果在您弄清楚这一点之前浏览器已将响应缓存为JavaScript,则在您清除浏览器缓存之前,它将无法工作 我将以下代码添加到我的ApplicationController中:
class ApplicationController < ActionController::Base
...
# These two filters together should ensure we return HTML responses to the browser's AJAX reqeusts.
before_filter :prevent_caching
before_filter :default_request_format_html
...
private
...
def prevent_caching
expires_now
end
def default_request_format_html
request.format = "html"
end
end
class ApplicationController
这些是最简单的表单,可以根据您的需要进行智能化处理(例如,有条件地强制使用请求格式)。
default\u request\u format\u html
回调更为关键-如果从一开始就正确,理论上不需要缓存破坏回调。这似乎是Chrome特有的问题。我对Firefox没有这种头痛。使用每个浏览器中的网络分析器,我看到Chrome选择将响应视为“text/javascript”,这导致了问题,而Firefox将其视为“html”,并且工作正常。然而,仍然不知道原因是什么。在过去的几个小时里,我一直在浏览jquery和jQueryUJS文件,但什么都没有找到。更改JS中的请求头或Rails应用程序中的响应头似乎没有效果。而且,问题是间歇性的。没关系。我一发表评论,就又开始工作了,它在Chrome上工作,在Firefox上不工作。
def create
render html: "PRETEND A USER WAS CREATED", content_type: :html
end
class ApplicationController < ActionController::Base
...
# These two filters together should ensure we return HTML responses to the browser's AJAX reqeusts.
before_filter :prevent_caching
before_filter :default_request_format_html
...
private
...
def prevent_caching
expires_now
end
def default_request_format_html
request.format = "html"
end
end