ruby Rails 5(来自Rails 4.2)和Devise 4(来自Devise 3)升级:在请求环境中找不到代理示例

oipij1gg  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(75)

所以我们正在升级一个旧的Rails 4应用程序。我们目前正在尝试从Rails 4.2跳到5.0。其中一部分涉及将Devise从版本3升级到版本4。我们在版本4中跳得很晚,因为它应该与Rails 5兼容,至少根据文档和www.example.com是这样railsbump.org
到目前为止,bundle安装是成功的,服务器启动了,但是访问任何页面都会导致devise的一些错误,我们很难弄清楚:

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的所有示例。.如果我们注解掉所有这些,使得这些方法不被使用,那么就不会有错误,页面将被加载。至少,这可以让我们在其他一些事情上取得进展,但显然,如果应用程序要正常运行,我们需要这些助手。
错误消息提到了测试,通过谷歌,ChatGPT等围绕这个问题进行的大量研究也调用了测试。但在测试环境中不会发生这种情况,我们相信这不是问题所在。
Warden::Manager中间件也存在于应用程序的中间件堆栈中。
This Issue提出了一些有趣的想法。我们的应用程序正在使用自定义异常应用程序,但与提出该问题的用户不同,此应用程序不继承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```
gcuhipw9

gcuhipw91#

我们解决了问题。原来,Web控制台中间件有一个错误,我们只需要把Web控制台的版本向前推一些。这个错误消息非常令人困惑,因为在中间件中,日志、Web控制台和devise/warden之间的某些事情发生的顺序

相关问题