2011-04-22 47 views
2

我提出一個簡單的Ajax刪除請求,像這樣的請求而發送的:Rails的3個簡單的AJAX刪除不工作,因爲authenticity_token沒有與

#invitation_actions 
    =link_to "delete", invitation_path(invitation), :method=>:delete, :remote=>true, :class=>"remove", :confirm=>'Are you sure you?' 

注意,有請求的頁面包含authenticity_token感謝包含在所有頁面中的csrf_meta_tag標籤。

當我看到在日誌中我看到了刪除請求缺少authenticity_token:

開始刪除「/請柬/ 5」 127.0.0.1在2011-04-22 11:21:21 -0700 處理由InvitationsController#摧毀 參數:{「ID」 =>「5」}

現在,如果我刪除了從代碼「:真:遠程=>」,即我做一個正常的網頁加載刪除作品,我在日誌文件中看到以下內容:

已啓動POST「/ invitations/10」for 127.0.0.1 at 2011-04-22 12:52:19 -0700 處理由InvitationsController#破壞作爲HTML 參數:{ 「authenticity_token」=> 「qlT8uX/WGQeOQSmVZzw1v8rFdSTHDRbzNY0zpSc9mV0 =」, 「ID」=> 「5」}

爲什麼一個DELETE在AJAX情況下,並在POST非AJAX的情況下? 爲什麼DELETE不包含authenticity_token?

感謝您的任何幫助。

回答

6

您的問題的第一個可能的原因(我能想到)是,如果您的UJS腳本超過了幾個月,您可能需要將其更新爲最新版本,以便您的應用程序發送真實性標記與AJAX請求。

此行爲變化發生在2011年2月,這意味着所有的Rails UJS腳本必須更新:

http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2d95a3cc23e03665

你問題的第二部分詢問有關HTTP POST動詞被用於在非AJAX情況下刪除。這是因爲Rails必須模擬REST表單處理,因爲瀏覽器不會實現所有4個HTTP動詞,例如GET,POST,PUT & DELETE,因爲這些動詞在HTML中無效。

JavaScript(AJAX)可以做到真正的事情,因爲它控制發送到您的AJAX端點的標頭。

+0

謝謝!這工作。新的新的rails.js文件解決了這個問題。 – 2011-04-22 22:10:20

1

此外,您還需要在應用程序佈局文件的<head>標記內添加<%= csrf_meta_tag %>。此幫助程序需要一些額外的<meta>標記,jquery_ujs腳本需要這些標記來組成有效的POST請求。