0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Error】コードは正しいはずなのにログアウトボタンを押すとエラーになる。Turbo

Last updated at Posted at 2024-10-16

前置きなく本題早速入ります

環境

  • Windows, WSL
  • Docker
  • Ruby 3.2.3
  • Rails 7.1.3

こうすることで解決した

👇エラーが起こっていたコード

<%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "btn btn-primary" %> 

👇エラー解消コード

<%= link_to "ログアウト", destroy_user_session_path, class: "text-sm font-semibold leading-6 text-gray-900", data: { turbo_method: :delete } %> 

一体何がいけなかったのか?

  • Turboの影響:
    • Rails 7以降では、Turboがデフォルトで使われる。(Turboはページの部分的な更新を可能にし、ページ遷移を軽くするライブラリ)
    • method: :deleteを使ったときに、UJS(Unobtrusive JavaScript)が正しく動作しない場合、Turboはこの情報を正しく処理できないことがある。
  • data: { turbo_method: :delete }の使用:
    • data: { turbo_method: :delete }を使うことで、TurboがこのリンクがDELETEリクエストであることを理解し、正しく処理。
    • これにより、JavaScriptが直接関与することなく、Railsのログアウト機能を正しく呼び出すことができる。
  • UJSとTurboの連携:
    • 元のコードでは、method: :deleteを指定してUJSに依存していたが、なぜかUJSが動作せず、DELETEリクエストが適切に送信されていなかった?!
    • Turboを使用することで、リクエストのメソッドを指定するための新しい方法が提供。正しく機能しログアウトができた。

★UJSについて★

UJS(Unobtrusive JavaScript)は、Railsが提供するJavaScriptライブラリで、特にリンクやフォームの動作を強化するために使用。
UJSを使うことで、例えばリンクにmethod: :deleteやmethod: :patchなどを指定し、サーバーに対して正しいHTTPメソッドを送信することができます。

Rails 6以前では、application.jsファイルでUJSを読み込むように設定されていたそうです。
app/assets/javascripts/application.jsに下記のような記述がある

//= require rails-ujs

ついでにRails7以降では次のように確認できるそうです

  • Rails 7以降importmapを使う場合)では、config/importmap.rbpin "@rails/ujs"があるか確認し、app/javascript/application.jsでインポートされているか確認。
  • Webpackerを使っている場合では、package.json@rails/ujsが含まれているか、そしてapp/javascript/packs/application.jsでインポートされているか確認。

さいごにまとめ

  • Rails 7以降はTurboが加わったことをしる
  • Turboを考慮してコードを書くことが大切!
  • 今回の記事が何か参考になれば幸いです。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?