2

私は次のような単純なajax削除リクエストを送信しています:

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

すべてのページに含まれているcsrf_meta_tagタグのおかげで、リクエストがあるページにはauthenticity_tokenが含まれていることに注意してください。

ログを見ると、削除リクエストにauthenticity_tokenがないことがわかります。

2011-04-2211:21:21-0700に127.0.0.1のDELETE"/invitations / 5"を開始しました。パラメーターとしてのInvitationsController#destroyによる処理:{"id" => "5"}

ここで、コードから「:remote =>:true」を削除すると、つまり、通常のページの読み込みを実行すると、削除が機能し、ログファイルに次のように表示されます。

2011-04-2212:52:19-0700に127.0.0.1のPOST"/invitations / 10"を開始しました。HTMLパラメーターとしてのInvitationsController#destroyによる処理:{"authenticity_token" => "qlT8uX / WGQeOQSmVZzw1v8rFdSTHDRbzNY0zpSc9mV0 ="、 "id" =>"5"}

AJAXの場合はDELETE、AJAX以外の場合はPOSTなのはなぜですか?DELETEにauthenticity_tokenが含まれていないのはなぜですか?

助けてくれてありがとう。

4

2 に答える 2

6

問題の最初の考えられる原因 (私が考えることができる) は、UJS スクリプトが数か月以上前のものである場合、アプリケーションが AJAX で認証トークンを送信するために、最新バージョンに更新する必要がある可能性があることです。リクエスト。

この動作の変更は 2011 年 2 月に行われたため、すべての Rails UJS スクリプトを更新する必要がありました。

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

質問の 2 番目の部分では、AJAX 以外の場合に削除に使用される HTTP POST 動詞について尋ねます。これは、ブラウザーが GET、POST、PUT、DELETE などの 4 つの HTTP 動詞をすべて実装していないため、Rails が REST フォーム処理をシミュレートする必要があるためです。これらの動詞は HTML では有効ではないためです。

JavaScript (AJAX) は、AJAX エンドポイントに送信されるヘッダーを制御するため、本当のことを行うことができます。

于 2011-04-22T20:26:28.060 に答える