2013-04-15 66 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' %>