更新到Rails 5和Devise 4.0.0.rc1后,设计authenticate_user!方法没有定义

Has*_*san 11 ruby-on-rails devise ruby-on-rails-5

我有一个rails应用程序,它与设计3和轨道4完美运行.我将轨道更新为5并且它给了DEPRECATION WARNING: alias_method_chain is deprecated.所以我不得不将设计版本更改为4.0.0.rc1.

现在好像遗赠是不会产生像的方法authenticate_user!,is_admin等等.

我收到以下错误

Before process_action callback :authenticate_user! has not been defined (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

我尝试了一切,包括卸载设计并再次安装,然后尝试从头开始创建一个单独的模型,但仍未定义方法.

有什么想法吗?

hel*_*ion 11

答案是简单地改变:

skip_before_action :authenticate_user!
Run Code Online (Sandbox Code Playgroud)

至 - -

skip_before_action :authenticate_user!, raise: false
Run Code Online (Sandbox Code Playgroud)

https://github.com/plataformatec/devise/issues/4207 https://github.com/thoughtbot/clearance/issues/621

  • 这样安全吗,好像有点hacky? (5认同)

Has*_*san 6

我可以确定问题,在rails 5中,如果在调用时没有定义跳过方法将会有异常,除非我们添加:unless条件.

  • 现在我在`config/environments/production.rb`中设置`config.eager_load = false`作为解决方法. (3认同)
  • 问题是在rails 5中,如果未定义要跳过的方法,则跳过回调选项将引发异常.在我的代码中,我正在跳过authenticate_user!关于应用程序初始化的方法,当时方法没有定义,设计稍后定义方法.如果我们希望rails不抛出异常,我们必须使用如下的另一个子句:`Devise :: SessionsController.skip_before_action:authenticate_user!,raise:false` (2认同)
  • 这完全令人困惑.你什么时候跳过这个?为什么?这实际上是如何解决这个问题的? (2认同)