背景
登録データを削除する機能を追加するため、以下のlink_to
を作成したが、deleteが機能せず削除できなかった。上手く検索できずにぐるぐるしたため、備忘録として残す。
<%= link_to('お店を削除', shop_path(@shop.id), method: :delete, data: { conform: "削除しますか?"} ) %>
状況
リンクをクリックすると削除されずに、詳細確認画面(shops#show)に戻ってきていた。
Started GET "/shops/3" for ::1 at 2024-10-13 22:19:26 +0900
Processing by ShopsController#show as HTML
Parameters: {"id"=>"3"}
Shop Load (0.2ms) SELECT "shops".* FROM "shops" WHERE (3) LIMIT ? [["LIMIT", 1]]
↳ app/controllers/shops_controller.rb:22:in `show'
原因
Rails7 以上では、rails-ujsが標準構成からはずれ、Turboが標準構成に追加されている。
rails-ujsとは何かについては、以下のサイトを参照。
Railsの一部のRESTfulな動作や非同期な処理などを実現するために、JavaScriptの送信に関する処理などが書かれたライブラリです。
rails-ujsは、link_to
ヘルパーのmethod
やconform
をjavascriptで処理するように定められているらしく、rails-ujsによってGET以外のHTTPメソッドが指定できるらしい。
Rails7では、rails-ujsの機能を吸収したTurboが標準構成となった。これにより、method
などの書き方が変更になっている。
解決方法
method
をturbo_method
に、confirm
をturbo_confirm
に変更する。
<%# rails-ujsの場合 %>
<%= link_to 'お店を削除', shop, method: :delete, data: { confirm: "削除しますか?" } %>
<%# Turboの場合 %>
<%= link_to 'お店を削除', cat, data: { turbo_method: :delete, turbo_confirm: "削除しますか?" } %>
参考にしたサイト
補足
上記「参考にしたサイト」に記載があるが、destroyアクションのリダイレクトにおいて、不具合が発生する可能性があることからリダイレクトにstatus: :see_other
を追加した。
redirect_to shops_path, status: :see_other