Rails7でlink_toを使ったmethod: :deleteのエラーと対処法
開発中に遭遇したエラー(というか不具合)の解消方法を調査したので、備忘録も兼ねて投稿します。
環境
問題の状況
以下のようなコードで、link_to
を使用して掲示板の一覧ページから各項目を削除するリンクを作成しました。
<%= link_to '削除', board, method: :delete %>
しかし、このリンクをクリックすると、なぜか掲示板の詳細ページに遷移してしまいました。
ブラウザで確認しても疑似メソッドとして「delete」が認識されていますし、ルーティング・コントローラーの設定も間違っていません。
# routes.rb resources :boards # boards_controller.rb def destroy board = Board.find(params[:id]) board.delete redirect_to boards_path end
問題の原因
Rails 7では、JavaScriptのハンドリングが大きく変わり、rails-ujs
が廃止され、新しくhotwired/turbo-rails
が導入されました。
この変更により、疑似メソッド(:delete
, :patch
など)のハンドリングが以前とは異なる動作となったことが原因のようです。
解決方法
importmap-rails
のインストール: Rails 7でJavaScriptを扱う新しい方法として、importmap-rails
を導入します。docker-compose run web bundle add importmap-rails docker-compose run web rails importmap:install
Dockerを使用している場合ですが、もしこの段階で
importmap
をインストールしていなかった場合は、上記コマンドを実行し、再ビルドを行います。link_to
の記述方法の変更:link_to
でのmethod: :delete
の部分をdata: { turbo_method: :delete }
に変更します。<%= link_to '削除', board, data: { turbo_method: :delete } %>
必要なJavaScriptライブラリのインストール: Rails 7で新たに必要となるJavaScriptライブラリを手動でインストールします。
docker-compose run web rails turbo:install stimulus:install
これらのステップを踏むことで、無事に削除機能を実施することができました。