🗑️
【Rails7】link_toを使ったmethod: :deleteのエラーと対処法
環境
- ruby: 3.2.2
- rails: 7.0.6
問題の状況
以下のようなコードで、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
これらのステップを踏むことで、無事に削除機能を実施することができました。
Discussion
コメント失礼致します。
私も同じ問題に躓いていてこの記事のおかげで解決しました。
ありがとうございました。
質問なのですが、どのようにしてこの解決方法を見つけたのか知りたいです。
例えば参考になった記事などあったら教えていただけると幸いです。
お忙しとは思いますがよろしくお願いいたします。