2013-04-15 108 views
0

我的ajax回调没有在我的生产环境中触发。但是,他们正在发展中,没有任何错误。为了讨论的缘故,我会简化一些事情。Rails 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响应。

但是,内容类型标题是生产中的text/javascript,但text/html正在开发中。为什么相同的代码在生产中响应text/javascript

回答

2

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

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

$.ajaxSetup 
    dataType: 'html' 

但是,还有其他一些方法可以向服务器询问特定的响应。 See this StackOverflow answer了解详情。

尽管如此,仍然存在着一个悬而未决的问题。为什么相同的代码在开发中发送text/html,但生产中的text/javascript

0

如果谷歌把你带到这里(就像它给我),因为ajax:success略有不同的情况是不是为你工作 - 当你使用的不是button_tolink_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永远不会被调用的原因。

要解决这个问题,在再培训局的class更改为form_class

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