はじめに
認証機能のdiviseを初めて利用する過程で起こった出来事になります。ログから学んだ事、実際におこなった事をまとめておきたいと思います
環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3
ログの中身について
bundle installを実行したところ以下ログが表示されました。
[DEVISE] Please review the [changelog] and [upgrade guide] for more info on Hotwire / Turbo integration.
[changelog] https://github.com/heartcombo/devise/blob/main/CHANGELOG.md
[upgrade guide] https://github.com/heartcombo/devise/wiki/How-To:-Upgrade-to-Devise-4.9.0-%5BHotwire-Turbo-integration%5D
表示されているのは、Hotwire/Turboという特定のフロントエンド技術に関する統合についての注意になります。
- Hotwire/Turbo は、JavaScriptを使わずにWebアプリのページ遷移を高速化したり、インタラクティブな動作を可能にする技術。
-
deviseもこの技術に対応するようにアップデートされていますが、Hotwire/Turboを使わない場合や、特に最新のフロントエンド技術を使わない場合は、このメッセージに記載された変更を意識しなくても大きな問題はないそうです。
turboあるか確認
Gemfileを確認したところgem "turbo-rails"の記述ありました。
turbo-railsとは?
- Rails アプリケーションに Turbo 機能を統合するための Gem 。
- Turbo は、Hotwire の一部で、ページ全体をリロードすることなく、部分的にページを更新したり、WebSocket を使ってリアルタイムでデータをやり取りする機能を提供。
- より高速で応答性の高い Web アプリケーションを構築できる
Devise と Turbo の関係
- Devise は認証を管理するための Gem で、ログインやユーザー登録などの操作を行う。
- Turbo を使うと、ログインページでのリダイレクト処理や、部分的なページ更新の挙動が変わることがあるめ、Devise も Turbo に対応できるように調整が必要になる場合がある
- Devise の 4.9.0 以降は Turbo に対応
アップグレードガイドのサイトの内容
Hotwire / Turbo
このバージョンの Devise では、Hotwire / Turbo / Turbo-Rails フレームワークとの統合が追加
最新の Responders(v3.1.0 以上)を使用する
Turbo のドキュメントによると、フォーム送信後のステートフルなリクエストでは、Turbo Drive はサーバーから HTTP 303 リダイレクトレスポンスが返されることを期待。その後、ページ全体をリロードせずにナビゲートし、ページを更新します。
例外は、レスポンスが 4xx または 5xx のステータスコードでレンダリングされた場。フォームのバリデーションエラーを表示するためにサーバーは 422 Unprocessable Entity で応答し、サーバーのエラー時には 500 Internal Server Error のメッセージが表示されます。
従来の Devise(および Responders)は、フォームのバリデーションエラーに対して 200 OK で応答し、302 Found でリダイレクトしていましたが、Hotwire/Turbo の導入に伴い、Rails は 422 Unprocessable Entity で応答し、POST/PUT/PATCH/DELETE リクエスト後は 303 See Other にリダイレクトするという新しい動作に合わせて変更。
Hotwire / Turbo とのより良い統合とこれらの新しいデフォルトに合わせるため、Devise は最新の Responders バージョン(v3.1.0 以上)が必要です。この Responders では、バリデーションエラーのレスポンスに使用されるステータス(error_status)や、POST/PUT/PATCH/DELETE リクエスト後のリダイレクトに使用されるステータス(redirect_status)を設定できます。
新しく生成されたアプリ(rails generate devise:install 実行後)は、すでにこれらの新しいデフォルトでセットアップされており、既存のアプリをアップグレードしている場合は、以下の設定で新しいレスポンス動作をオプトインできます。
# config/initializers/devise.rbDevise.setup do |config| # ... config.responder.error_status = :unprocessable_entity config.responder.redirect_status = :see_other # ... end後方互換性を保つため、Devise は内部的に error_status を
(200 OK)、redirect_status を
(302 Found) として設定していますが、上記のように設定することで、それぞれ 422 Unprocessable Entity と 303 See Other となり、Hotwire/Turbo が期待する動作に一致します。
最新の Responders バージョンがインストールされていない場合、この設定をしても警告が表示されるだけで、効果はありません。
注意:これらのデフォルトは、将来的に Devise の新しいバージョンで変更され、Rails + Hotwire/Turbo のデフォルトにより一致する可能性があります。
後々の為にDeviseを最新のものに変更しておく方がいいのか?
gem "devise", "~> 4.9", ">= 4.9.4"
-
~> 4.9は、バージョン 4.9.x までの範囲で更新可能という意味です。つまり、4.9.0 以上、5.0.0 未満のバージョンがインストールされる。 -
>= 4.9.4は、最低でもバージョン 4.9.4 以上を指定するという意味。
devise
Gemfile.lockでインストール前は上記
再インストール後は下記👇
devise (~> 4.9, >= 4.9.4)
最後にまとめ
インストール後のログがいつもと違うような記述があった時は必ず目を通すておくと後々エラーが起こりにくい環境を構築できることにもつながるのかな。。と思いました。
今回の記事が何か参考になれば幸いです。