Rails - 设计和行为_as_audited
Posted
技术标签:
【中文标题】Rails - 设计和行为_as_audited【英文标题】:Rails - Devise and acts_as_audited 【发布时间】:2011-03-24 20:05:00 【问题描述】:嘿,我想一起使用 Devise 和acts_as_audited 但是当我尝试使用 -
链接它们时class ApplicationController < ActionController::Base
audit Candidate
protected
def current_user
@user = User.find(user_session)
end
我收到此错误。
stack level too deep
我需要采取不同的方式吗?
谢谢
【问题讨论】:
【参考方案1】:这是一个古老的问题,但仍然令人头疼。这是一个不同的、可能更适合我的解决方法。
首先,正如其他人所描述的,错误发生在将已审核(以前称为acts_as_audited)与设计(以及可能的其他身份验证 gem)一起使用时,然后当您审核设计在您的用户模型上使用的任何列(last_sign_in_at、last_sign_in_ip、等)。
-
Devise 尝试对用户进行身份验证(使用其 authenticate_user!before_filter)。
Devise 尝试更新/保存用户的登录信息(last_sign_in_at、ip 等)以供后代使用
作为该保存的一部分,Audited 然后尝试为该更改创建审核。
已审核尝试为该审核设置用户,以指示进行更改的人员。它是如何做到的?
已审核调用 current_user,这是一种设计方法。 Devise 尚未使用步骤 1 中的身份验证方法完成 - Audited 介入并正在做它的事情。所以,
current_user 方法重复第 1 步(authenticate_user! 方法),创建一个无限循环
您的应用程序错误,堆栈级别太深
@DGM 的解决方法只是告诉 Audited 不要审核此更改,这可能对您有用。但是,在我的应用程序中,我需要审核该更改。
Audited 允许您为 current_user 指定不同的方法。
在应用程序控制器中,添加新方法,引用 current_user 实例变量。
def my_cool_method
@current_user
end
然后,在 config/initializers/audited.rb 中,告诉 Audited 使用您的新方法:
Audited.current_user_method = :my_cool_method
通过此更改,Audited 仍将审核更改,但不会尝试设置审核的用户(进行更改的人) - 将为零。
与 DGM 的替代解决方案相比,此更改的另一个优势是我们不会覆盖 Devise 的 current_user 方法,该方法类似于猴子修补,因为它可能会在以后导致意想不到的后果。
【讨论】:
一条评论:我还没有确定为什么会偶尔发生这种情况。如果有人都知道这一点,我很想知道。【参考方案2】:只是为了关闭它。
堆栈级别太深是因为设计内置了对 current_user 变量的审核。
所以每次访问变量时都会导致无限循环。
【讨论】:
【参考方案3】:进一步解释-acts_as_audited 在检查要忽略的内容之前调用 current_user,如果 current_user 触发表更改,则再次调用审计,噗。无限循环。
我对 authlogic 存在相同问题的解决方法是在设置会话时禁用审核:
def current_user
return @current_user if defined?(@current_user)
User.without_auditing do
@current_user = current_user_session && current_user_session.user
end
@current_user
end
但是,我仍然遇到了一些我不想点击的其他回调。这是 authlogic 的问题,不是 act_as_audited 的问题。
最终,我更希望由 devise 或 authlogic 完成的审计以绕过验证、回调和时间戳的方式进行。
【讨论】:
【参考方案4】:单独使用 Authlogic 也会发生同样的事情。解决方案是添加带有以下字段的 :except 参数(见下文)。也许类似的东西也适用于 Devise。
# 明确定义,否则“堆栈 级别太深”
acts_as_audited :except => [ :persistence_token, :perishable_token, :login_count, :failed_login_count, :last_request_at, :current_login_at, :last_login_at, :current_login_ip, :last_login_ip ]
【讨论】:
这不适用于 authlogic,如下所述。异常代码发生在无限递归之后。以上是关于Rails - 设计和行为_as_audited的主要内容,如果未能解决你的问题,请参考以下文章