🗑️

【Rails7】link_toを使ったmethod: :deleteのエラーと対処法

2024/01/16に公開

環境

  • 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 など)のハンドリングが以前とは異なる動作となったことが原因のようです。

解決方法

  1. importmap-railsのインストール:
    Rails 7でJavaScriptを扱う新しい方法として、importmap-railsを導入します。

    docker-compose run web bundle add importmap-rails
    docker-compose run web rails importmap:install
    

    Dockerを使用している場合ですが、もしこの段階でimportmapをインストールしていなかった場合は、上記コマンドを実行し、再ビルドを行います。

  2. link_toの記述方法の変更:
    link_toでのmethod: :deleteの部分をdata: { turbo_method: :delete }に変更します。

    <%= link_to '削除', board, data: { turbo_method: :delete } %>
    
  3. 必要なJavaScriptライブラリのインストール:
    Rails 7で新たに必要となるJavaScriptライブラリを手動でインストールします。

    docker-compose run web rails turbo:install stimulus:install
    
    

これらのステップを踏むことで、無事に削除機能を実施することができました。

Discussion