2010-10-13 55 views
1

我是相當新的軌道,所以原諒我,如果我在這裏犯了一些愚蠢的錯誤。我正在嘗試使用link_to進行ajax調用,並響應js.erb模板。它不太好。鏈接正確呈現:問題與鐵軌阿賈克斯調用

<a href="/show" data-method="post" data-remote="true" rel="nofollow">Click</a> 

準系統show動作:

def show 
    respond_to do |format| 
    format.js {render :layout => false} 
    end 
end 

而且show.js.erb只包含用於測試的警報。當我點擊鏈接時,我毫不客氣地被引導到localhost:3000/show,這是完全空白的。它似乎是一個GET請求,儘管將該方法聲明爲POST,並且出現「406 Not Acceptable」錯誤。

Started GET "/show" for 127.0.0.1 at Tue Oct 12 19:58:17 -0500 2010 
Processing by PostsController#show as HTML 
Completed 406 Not Acceptable in 1ms 

編輯:我做了一個測試request.xhr在表演的動作,顯然不包括Ajax調用正在取得進展。那麼我在這裏做錯了什麼?

+0

您的佈局是否通過'javascript_include_tag'包含腳本? – 2010-10-13 01:52:38

+0

是的,它的確如此。 asdf – herpderp 2010-10-13 04:24:26

回答

0

啊哈,問題在於jQuery與prototype.js衝突。我將它設置爲noConflict模式,它工作。

+0

你是怎麼想出這個解決方案的?這只是一個「啊哈!」一時,還是你調試了代碼? – Matt 2010-10-15 17:57:51

1

從您的描述中可以看出,您的鏈接看起來像沒有隱藏的JavaScript監聽器,因此瀏覽器只是遵循鏈接的href。所以這個問題似乎在客戶端。

但是,您的問題沒有給出足夠的細節以給出直接的答案,所以我只列出我爲調查此問題而採取的所有步驟。

首先,爲了使這項工作,你必須在你的佈局<head>標籤內包含所有必需的javascript和csrf元標籤。這是最好做到這一點的:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

如果你有這個,加載頁面,查看源代碼,如果它真的正確生成的鏈接。您應該看到這樣的事情:

<head> 
    <script src="/javascripts/prototype.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/effects.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/dragdrop.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/controls.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/rails.js?1285857859" type="text/javascript"></script> 
    <script src="/javascripts/application.js?1285934960" type="text/javascript"></script> 
    <meta name="csrf-param" content="authenticity_token"/> 
    <meta name="csrf-token" content="b2HRysd23edj1/vrCSRDSac0seDFae3n2gCoTjt0="/> 
</head> 

如果他們在那裏,我安裝的Firebug的JavaScript調試器,或使用Chrome開發人員工具,打開它,看看是否有是頁面上的任何錯誤時,它的加載和當你點擊鏈接。你也可以查看發送的請求,看看它們是否是xhr。

如果仍然無效,請在Firebug中打開rails.js,並在負責在data-remote和/或data-method上附加聽衆的代碼片段之前設置一個斷點。這是一個:

document.on("click", "a[data-remote]", function(event, element) { 
    if (event.stopped) return; 
    handleRemote(element); 
    event.stop(); 
    }); 

在第一行設置一個斷點,並在處理函數中設置第二個斷點。然後重新加載頁面並查看它是否附加了偵聽器。然後點擊鏈接,看看處理程序是否被解僱。然後......這取決於發生了什麼。希望你可以繼續自己。

而只是一個普遍的說明 - 我認爲show行動應與get而不是post訪問。

- 編輯 -

我覺得406 not acceptable返回,因爲你沒有format.htmlrespond_to塊做。如果你添加它,那麼它應該只呈現show.html.erb模板。

+0

我有螢火蟲,是的,包括正確的js文件。頁面加載時或點擊鏈接時沒有相關的錯誤。沒有xhr請求,只是406請求。我不知道我應該「看看它是否附加了偵聽器」,但是處理函數被觸發。 – herpderp 2010-10-13 19:14:51

+0

我只是說如果執行到'document.on'行。所以如果處理函數被觸發,它是否到達第二行('handleRemote(element)')?如果確實如此,請嘗試更深入地調試以瞭解爲什麼它不發送xhr請求。 – Matt 2010-10-13 22:44:05

+0

我已經找出問題所在,請看 – herpderp 2010-10-15 17:46:09