Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails默认为";text/javascript“;内容类型,用于响应使用表单_为_Javascript_Ruby On Rails_Ajax_Content Type_Unobtrusive Javascript - Fatal编程技术网

Rails默认为";text/javascript“;内容类型,用于响应使用表单_为

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,

我使用的是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, 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