Rails ajax:成功回调不会在生产中触发

时间:2013-04-15 02:26:36

标签: ruby-on-rails ajax

我的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:点击生产链接时会触发错误。

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

我的生产日志未显示任何错误,Chrome开发者工具中的网络标签显示200 OK响应,其中部分为正文。

但是,Content-Type标题在生产中为text/javascript,但正在开发中text/html为什么在生产中使用text/javascript响应的代码相同?< / p>

2 个答案:

答案 0 :(得分:2)

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

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

$.ajaxSetup
  dataType: 'html'

但是,还有其他几种方法可以要求服务器提供特定的响应。 See this StackOverflow answer了解详情。

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

答案 1 :(得分:0)

如果Google将您带到这里(就像它对我说的那样)因为ajax:success在稍微不同的情况下不适合您 - 当您使用button_to代替{{1}时这可能会为你节省一些头脑。

假设你有这个修改过的ERB:

link_to

这个JS不会工作:

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

自从$(document).on("ajax:success", ".new-foo", function() { console.log("success!"); }); 标记上显示课程new-foo以来,这不会有效,而input标记上会显示data-remote="true"。结果form标记会触发ajax:success事件,而不会触发子form标记,以及input永远不会被调用的原因。

要解决此问题,请在ERB中将console.log更改为class

form_class