2010-08-03 77 views
2

嘿,我想用设计和acts_as_audited在一起,但是当我尝试使用它们连接 -导轨 - 设计和acts_as_audited

class ApplicationController < ActionController::Base 
audit Candidate 
protected 

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

我得到这个错误。

stack level too deep 

我需要以不同的方式做吗?

感谢

回答

1

就关闭这个功能。

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

所以每次访问变量都会导致无限循环。

0

单独使用Authlogic也会发生同样的情况。解决方案是添加:除了参数与以下字段(见下文)。也许类似的东西也可以与Devise一起使用。

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

acts_as_audited :除了=> [:persistence_token,
:perishable_token,:login_count,
:failed_login_count,
:last_request_at,: current_login_at, :last_login_at,:current_login_ip,
:last_login_ip]

+0

这不适用于authlogic,正如我在下面解释的。异常代码发生在无限递归之后。 – DGM 2011-07-11 21:21:31

1

进一步解释 - acts_as_audited在检查要忽略的内容之前调用current_user,如果current_user触发表更改,则再次调用审计,poof。无限循环。

我与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完成的审计以绕过验证,回调和时间戳的方式进行。

3

这是一个古老的问题,但仍然存在它的丑陋的头。这是一个不同的,可能更适合我的解决方法。首先,正如其他人所描述的那样,当使用审计(以前称为acts_as_audited)和devise(以及潜在的其他身份验证gem),然后在审计Devise在您的User模型中使用的任何列时,会发生此错误(last_sign_in_at,last_sign_in_ip等)。

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

@ 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方法,它类似于猴子修补,因为它可能会在稍后导致意想不到的后果。

+0

一个评论:我还没有确定为什么偶尔会发生这种情况。如果任何人都知道,我很想知道。 – MrDerp 2015-01-12 21:37:55