【Rails】link_toでdeleteが効かない時の解決方法
最近たまにある現象
・link_toで実装した削除ボタンが正常に動かない
・deviseを使用したログアウト機能でUsersコントローラーのshowアクションが動く
どちらも、HTTPメソッドにDELETEを指定しているにもかかわらずGETでリクエストが送られていることが原因でした。
※メソッドの指定はできている状態の話です。まずは検証ツールでHTMLを確認します。
<a data-method="delete" href="/users/sign_out">ログアウト</a>
結論
head間は触らないほうがいいです。
rails newコマンドでアプリを作成した際、レイアウトファイル(application.html.erb)内のhead間には以下の記述がデフォルトであるはずです。
一見意味がわかりませんが、消さないでください。まとめて貼れば解決します。
<head>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
今回必要だった記述は2行
application.jsの読み込み
application.html.erb
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
application.jsを読み込んでいます。これでdeleteメソッドが効くようにはなります。
CSRF対策
CSRF(クロスサイトリクエストフォージェリ)対策の以下の記述をします。
これがないと意図しないリクエストを受信してしまいます。脆弱性です。
<%= csrf_meta_tags %>
Railsのルールのようです。参考
解決しなかった場合
javascriptのrequireを記述する
app/assets/javascript/application.js内に以下を記述する。
//= require jquery
//= require jquery_ujs
jquery_ujsはハイパーリンクからGET以外のリクエストを生成してくれます。
なぜJSが必要か
HTMLで使えるHTTPメソッドはGETとPOSTのみです。
今回使いたかったDELTEはjavascriptで擬似的に作成されるため、HTMLで読み込めなければ動きません。
詳しい動きはこちらが参考になります。
まとめ
携帯用ホムペの時代からhead間編集(上級者向け)だったことを覚えています。
これに限らず、デフォルトの記述を消す時は本当に大丈夫か一旦調べて考えてみてください。
Author And Source
この問題について(【Rails】link_toでdeleteが効かない時の解決方法), 我々は、より多くの情報をここで見つけました https://qiita.com/ytleoo/items/6fa36f4f3e5b05df7b13著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .