🗑️

【Rails7.0】削除リンクが作成出来ない場合の作成方法

2023/04/13に公開

概要

昨夜、CRUD処理のDeleteの実装で、Deleteメソッドが効かないトラブルに遭遇した。
今回はその原因と解決法をまとめたので、ここに記述する。

問題

Rails7.0で

  • Deleteメソッドが効かない
  • link_toが機能しない

正確に記述すると

  • 削除リンクが作成出来ない

原因

Ruby on Rails 7.0では、rails-ujsが標準構成から外れ、Turboが標準構成に入った。
それに伴い、Deleteが機能せず、確認メッセージも表示されなくなった。
https://picolab.dev/2022/03/23/rails7-turbo/

Turbo Framesとは

前提知識:Hotwire

Hotwireは、JavaScriptを極力書かずにモダンなアプリケーションを作成するためのフレームワーク。Hotwire自体はライブラリではなく、実態は複数のライブラリを統合したもの。

TurboHotwireの中心となる要素だ。
TurboはTypeScriptで書かれたサーバー側言語に依存しないフレームワークだが、サーバー側言語との接続にはアダプタを書く必要がある。
Railsで使う場合はすでに用意されていて、便利なヘルパーを使うことができる。このヘルパーを実装するのがgem turbo-railsだ。
https://zenn.dev/takeyuwebinc/articles/4bbb3df6ef6344

rails-ujsとは

Railsの一部のRESTfulな動作や非同期な処理などを実現するために、JavaScriptの送信に関する処理などが書かれたライブラリ。

例えば、Viewヘルパーの form_with( form_forなど)の remote: trueオプションだったり、 link_toの method: :deleteなどのオプションをそれっぽく動くように動作させられるようになる
https://www.inodev.jp/entry/2019/12/03/234210

解決策

以下のgemをインストールしよう

Gemfile
gem "importmap-rails" #ESMとimportmapを使用して、トランスパイルやバンドルなしでRailsのモダンなJavaScriptを管理

gem "turbo-rails" #JavaScriptを一切記述することなく、シングルページのWebアプリケーションのようなスピードを実現

gem "stimulus-rails" #あなたがすでに持っているHTMLのための控えめなJavaScriptフレームワーク

インストール後は

$ rails importmap:install
$ rails turbo:install stimulus:install

以上のコマンドを実行することで無事に、Deleteメソッドが使用できるようになる。

※その際以下のファイルは初期化されるので既に存在&記述してある場合は注意が必要だ
app/javascript/application.js
config/importmap.rb

参考

https://picolab.dev/2022/03/23/rails7-turbo/
https://www.inodev.jp/entry/2019/12/03/234210

まとめ

  • 原因:Rails7.0で削除リンクが作成出来ないのは、7.0からはrails-ujsが標準構成から外れ、Turboが標準構成に入ったから
  • 解決策:gemのimportmap-railsturbo-railsstimulus-railsの3つをインストールしよう

Discussion