0

我的 ajax 回调没有在我的生产环境中触发。但是,它们在没有错误的情况下在开发中触发。为了讨论,我会简化一些事情。

假设我有一个使用的链接remote: true

<%= link_to "Add Foo", new_foo_path, remote: true, id: 'new-foo' %>

foos_controller.rb

class FoosController < ApplicationController
  def new
    @foo = Foo.new
    render partial: 'form' if request.xhr?
  end
end

使用 Chrome 的控制台,我绑定到ajax:success

$(document).on("ajax:success", "#new-foo", function() { console.log("success!"); });

在开发中,这工作正常;我得到了“成功!” Chrome 控制台中的消息。

然而,在生产中,它没有。正在发出请求,响应是form部分的,但不会触发回调。

有任何想法吗?

PS。以下不起作用。

$("#new-foo").bind("ajax:success", function() { console.log("success!"); })

没有任何变化config/environments/production.rb

编辑:事实证明 ajax:error 当我单击生产中的链接时被触发。

$(document).on("ajax:error", "#new-foo", function() { console.log("error"); });

我的生产日志没有显示任何错误,并且 Chrome 开发人员工具中的网络选项卡显示以200 OK部分作为正文的响应。

但是,Content-Type 标头正在text/javascript生产中,但text/html正在开发中。为什么text/javascript在生产中响应相同的代码?

4

2 回答 2

2

问题是浏览器试图将响应正文作为 JavaScript 执行,因为返回的 Content-Type 标头是text/javascript而不是text/html.

有很多方法可以解决这个问题。我选择使用 jQuery 的$.ajax函数来设置我所有dataType的ajax 调用。这将要求服务器发回.text/html

$.ajaxSetup
  dataType: 'html'

但是,还有其他几种方法可以向服务器请求特定响应。有关详细信息,请参阅此 StackOverflow 答案

不过,仍有一个挥之不去的问题。为什么相同的代码text/html在开发中发回但text/javascript在生产中?

于 2013-04-15T12:56:30.277 回答
0

如果 Google 将您带到这里(就像它对我所做的那样),因为ajax:success在稍微不同的情况下不适合您 - 当您使用button_to而不是 时link_to,这可能会为您省去一些麻烦。

假设您有这个修改后的 ERB:

<%= button_to "Add Foo", new_foo_path, remote: true, class: 'new-foo' %>

这个 JS 不起作用:

$(document).on("ajax:success", ".new-foo", function() { console.log("success!"); });

这不起作用,因为类new-foo是在input标签上呈现的,而data-remote="true"是在标签上呈现的form。结果,该ajax:success事件在form标签上触发 - 而不是子input标签,这就是console.log永远不会调用的原因。

要解决此问题,请将 ERB 中的更改class为:form_class

<%= button_to "Add Foo", new_foo_path, remote: true, form_class: 'new-foo' %>
于 2015-10-02T20:30:13.110 回答