这是一个古老的问题,但仍然存在它的丑陋的头。这是一个不同的,可能更适合我的解决方法。首先,正如其他人所描述的那样,当使用审计(以前称为acts_as_audited)和devise(以及潜在的其他身份验证gem),然后在审计Devise在您的User模型中使用的任何列时,会发生此错误(last_sign_in_at,last_sign_in_ip等)。
- 设计尝试验证用户(使用它的authenticate_user!before_filter)。
- 设计试图更新/保存后代的用户登录信息(last_sign_in_at,ip等)
- 作为该保存的一部分,审核然后尝试为该更改创建审核。
- 审核尝试为该审核设置用户,以指示由谁进行更改。它是如何做到的?
- 经过审计的调用current_user,一种Devise方法。设计尚未完成其步骤1中的验证方法 - 审核已经进入并正在进行。所以,
- 的CURRENT_USER方法重复步骤#1(发生authenticate_user!方法),创建一个无限循环
- 您与堆栈级别太深应用程序错误
@ DGM的解决方法简单地告诉经审核不审核此改变,这可能对你有用。但是,在我的应用程序中,我需要审核该更改。
审计允许您指定一个不同的方法用于current_user。
在应用程序控制器中,添加您的新方法,请参阅current_user 实例变量。
def my_cool_method
@current_user
end
,然后在配置/初始化/ audited.rb,告诉审计使用新的方法:
Audited.current_user_method = :my_cool_method
随着这一变化,经审核仍然会审核的变化,但它不会尝试设置审计的用户(进行更改的人) - 这将是零。
DGM替代解决方案的另一个优势是我们不覆盖Devise的current_user方法,它类似于猴子修补,因为它可能会在稍后导致意想不到的后果。
这不适用于authlogic,正如我在下面解释的。异常代码发生在无限递归之后。 – DGM 2011-07-11 21:21:31