3

嘿,我想一起使用 Devise 和acts_as_audited 但是当我尝试使用链接它们时 -

class ApplicationController < ActionController::Base
 audit Candidate
 protected

 def current_user
   @user = User.find(user_session)    
 end

我得到这个错误。

stack level too deep

我需要做不同的事情吗?

谢谢

4

4 回答 4

6

这是一个古老的问题,但仍然抬起了丑陋的头。这是一个不同的,可能更合适的解决方法,它对我有用。

首先,正如其他人所描述的,错误发生在将已审核(以前称为acts_as_audited)与设计(以及可能的其他身份验证 gem)一起使用时,然后当您审核设计在您的用户模型(last_sign_in_at、last_sign_in_ip 等)上使用的任何列时。

  1. 设计尝试对用户进行身份验证(使用其 authenticate_user!before_filter)。
  2. 设计尝试更新/保存用户的登录信息(last_sign_in_at、ip 等)以供后代使用
  3. 作为该保存的一部分,Audited 然后尝试为该更改创建审核。
  4. Audited 尝试为该审核设置用户,以指示谁进行了更改。它是如何做到的?
  5. 审核调用 current_user,一种设计方法。Devise 尚未使用步骤 1 中的身份验证方法完成 - Audited 介入并正在做它的事情。所以,
  6. current_user 方法重复第 1 步(authenticate_user! 方法),创建一个无限循环
  7. 您的应用程序错误堆栈级别太深

@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 仍将审核更改,但不会尝试设置审核的用户(进行更改的人) - 那将是 nil。

与 DGM 的替代解决方案相比,此更改的另一个优点是我们没有覆盖 Devise 的 current_user 方法,该方法类似于猴子修补,因为它可能会在以后导致意想不到的后果。

于 2015-01-12T21:37:15.533 回答
1

只是为了关闭它。

堆栈级别太深是因为 devise 内置了对 current_user 变量的审计。

因此,每次访问变量时都会导致无限循环。

于 2010-08-07T12:30:26.867 回答
1

进一步解释 - 在检查要忽略的内容之前,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 完成的审计以绕过验证、回调和时间戳的方式进行。

于 2011-07-11T21:20:33.083 回答
0

仅 Authlogic 也会发生同样的事情。解决方案是使用以下字段添加 :except 参数(见下文)。也许类似的东西也适用于 Devise。

# 明确定义“堆栈级别太深”

act_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 ]

于 2010-10-26T16:17:04.617 回答