Rails 5 (Rails 4.2 から) および Devise 4 (Devise 3 から) のアップグレード: Warden::Proxy インスタンスがリクエスト環境で見つかりません
概要
そのため、私たちは古い Rails 4 アプリをアップグレードしているところです。私たちは現在、Rails 4.2 から 5.0 に移行しようとしています。これには、Devise をバージョン 3 からバージョン 4 にアップグレードすることが含まれます。少なくともドキュメントとrailsbump.orgによると、これはRails 5と互換性があるはずなので、バージョン4に遅れてジャンプしました。
これまでのところ、バンドルのインストールは成功し、サーバーが起動しますが、どのページにアクセスしても、デバイスからいくつかのエラーが発生し、それを理解するのに苦労しました。
Error during failsafe response: Devise could not find the `Warden::Proxy` instance on your request environment.
Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack.
If you are seeing this on one of your tests, ensure that your tests are either executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` module to inject the `request.env['warden']` object for you.
/home/josh/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/devise-4.9.2/lib/devise/controllers/helpers.rb:143:in `warden'
/home/josh/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/devise-4.9.2/lib/devise/controllers/helpers.rb:126:in `current_user'
/home/josh/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/paper_trail-4.0.2/lib/paper_trail/frameworks/rails/controller.rb:19:in `user_for_paper_trail'
/home/josh/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/gems/paper_trail-4.0.2/lib/paper_trail/frameworks/rails/controller.rb:65:in `set_paper_trail_whodunnit'
スタック トレースから、current_user が制御していない Paper_trail コードから呼び出されていることがわかります。 ApplicationController で問題のある Paper_trail ユーザー メソッドをオーバーライドし、そこで何が起こるかを制御できます。これにより、current_user と user_signed_in? のすべてのインスタンスを制御できるようになります。 。これらのメソッドが使用されないようにすべてをコメントアウトすると、エラーは発生せず、ページが読み込まれます。少なくとも、これにより他のいくつかの作業を進めることができますが、アプリが適切に機能するためには明らかにこれらのヘルパーが必要です。
エラー メッセージにはテストについて言及されており、Google、ChatGPT などによるこの問題に関する多くの調査でもテストが必要とされています。しかし、これはテスト環境では起こっておらず、これが問題ではないと確信しています。
Warden::Manager ミドルウェアも、アプリのミドルウェア スタックに存在します。
この号ではいくつかの興味深いアイデアが取り上げられました。私たちのアプリはカスタム例外アプリを使用していますが、その問題を提起したユーザーとは異なり、このアプリは ApplicationController から継承しません。このコードをコメントアウトしても問題は解決されません。ただし、誰かがそれに気づいた場合に備えて、カスタム例外のコードを次に示します。
def call(env)
status = env["PATH_INFO"][1..-1]
if status == "404" || status == '422' || status == '500'
Rails.application.routes.call(env)
else
super
end
end
end```
解決策
私たちは問題を解決しました。結局、Web コンソールのミドルウェアにエラーがあったため、Web コンソールのバージョンを少し上げるだけで済みました。ロギング、Web コンソール、およびデバイス/ワーデンの間のミドルウェアで特定の処理が発生する順序のため、エラー メッセージは非常にわかりにくいものでした。