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


我有一个rails应用程序,它与设计3和轨道4完美运行。我将rails更新为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)

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

有什么想法吗?


2338
2018-02-14 16:41


起源

这有什么更新?我正试图在rails 5上实现逐步参与并在wiki之后获得类似的错误。 - Kevin Brown
我不确定你得到的错误是什么,对于我的情况来说这是rails5中的一个功能升级,它可以通过添加一个额外的参数来修复,我在接受的答案中提到了它。我可以通过放置一个来检查文件来找出问题 binding.pry debug语句如果从终端运行它,你可能会得到一个文件路径和行号,它会引发错误,所以不要害怕潜入它。 - Hassan


答案:


答案是简单地改变:

skip_before_action :authenticate_user!

至 - -

skip_before_action :authenticate_user!, raise: false

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


9
2017-07-22 16:23



这样安全,看起来有点hacky? - Richard Peck


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


6
2018-02-16 17:12



你能提供更多详细信息吗? - Yannick Schuchmann
现在我定了 config.eager_load = false 在 config/environments/production.rb 作为一种解决方法。 - Yannick Schuchmann
问题是在rails 5中,如果未定义要跳过的方法,则跳过回调选项将引发异常。在我的代码中,我正在跳过authenticate_user!关于应用程序初始化的方法,当时方法没有定义,设计稍后定义方法。如果我们希望rails不抛出异常,我们必须使用如下的另一个子句: Devise::SessionsController.skip_before_action :authenticate_user!, raise: false - Hassan
这完全令人困惑。你什么时候跳过这个?为什么?这实际上是如何解决这个问题的? - tirdadc


在rails5支持自己设计之前,你可以尝试使用这个fork:

gem 'devise', github: 'twalpole/devise', branch: 'rails5'

1
2018-03-13 18:14



这可以做一些更多的解释。 - Joseph Lord
这可能已经过时了 - 叉子已经有3个月了,设计大师现在也有类似的变化 - Vasfed