私はマイケル・ハートルのRailsチュートリアル、そして何らかの理由で次のコードに従っています:
<%= link_to 'delete', user, :method => :delete, :confirm => "You sure?",
:title => "Delete #{user.name}" %>
GET要求を発行します(Railsサーバーログ)を確認して確認しました。また、次の行がアプリケーションビューにあることも確認しました。
<%= javascript_include_tag :all %>
私がよく理解していなかったことの1つは、おそらく私の問題の原因です。「delete」メソッドはどこで定義されていますか? Hartlのソースコード で、「delete」ではなく、コントローラーで「destroy」メソッドを定義していることを確認しました。しかし、link_toを:method =>:destroyに変更しても、GETが発行されるだけです。
Rails 3.1。ヒントはありますか?
ほとんどのブラウザはDELETE動詞を実際にサポートしていないため、Railsは生成するHTMLを変更することで偽装します。Rails _data-method
_に設定し、_"delete"
_に設定します。したがって、ユーザーがリンクをクリックすると、実際にはGET
リクエストとして発行されますが、_data-method
_属性はRails magicは、ルーティングコードがDELETEリクエストとして認識することを意味します。
編集:
コンソールで自分でテストできます。 _bundle exec Rails c
_を実行してコンソールに入り、これが生成するHTMLを確認します。
_helper.link_to "delete", "foobar/delete", :method => 'delete'
_
HTMLは次のようになります。
_<a href="foobar/delete" data-method="delete" rel="nofollow">delete</a>
_
また、これがapplication.jsにあることを確認します。
//= require jquery
//= require jquery_ujs
どうやらjquery_ujsのないjqueryがあり、それを追加するまで同じ問題がありました。
実際には、次のコードを使用する必要があります
<%= button_to "delete", @user_current, :method => "delete" %>
問題を解決するか、この行を追加します// = application.jsにjquery_ujsを要求し、使用します:
<%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } ,
:title => "Delete #{user.name}" %>
マイケルのチュートリアルでも同じ問題に直面しました。 data-method="delete"
は実際に期待どおりに動作します-コントローラーでdestroyアクションを呼び出します。 GET
(最終的には失敗)を試みる理由は次のとおりです。
コントローラーのbefore_filter
の1つがsigned_in_user
に設定され、session_helper.rb
でsigned_in_user
がstore_location
を呼び出していることがわかります( session[:return_to]
を現在のURLに更新します。
そのため、コントローラーの破棄アクションに戻り、redirect_back_or
を試行し、結果としてGET current_url
になります。ユーザーがまだサインインしていないときにのみsigned_in_user
を呼び出すようにstore_location
ヘルパーを変更しました。
ブラウザはDELETE
動詞をサポートしていないため、Railsは、標準のDELETE
を介してGET
要求をシミュレートすることにより、この問題の回避策を作成しますまたはPOST
。method: :delete
の動作方法は、リクエストを変更するdata-method="delete"
を含むすべてのリンクのJavaScriptハンドラーを使用するため、Railsが- [〜#〜] delete [〜#〜]。このJavaScriptハンドラーは、jquery_ujs
ライブラリーによって提供されます。
間違っている可能性のあることがいくつかあります。
jquery
とjquery_ujs
の両方がロードされていることを確認してくださいapplication.js
.method: :delete
オプションが実際に指定されていることを確認してください。$( 'a' ).click( function( event ) {
event.stopPropagation()
})
これにより、jquery_ujs
ハンドラーの実行が妨げられ、リクエストは変更されず、標準のGETのままになります。
オンRails 5:
同じ問題があり、すべての 'DELETE'投稿が危険にさらされ、crudページに影響を与え、サインアウトを考案しました...私がしなければならなかった問題を解決するために:
// = Rails-ujsが必要