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的主要内容,如果未能解决你的问题,请参考以下文章

Rails 设计角色模型和 CanCanCan - 定义能力

js_面向对象设计和行为委托设计模式

设计模式行为型模式

设计模式_基础知识

设计模式_基础知识

Rails设计gem:强制注销浏览器选项卡关闭