嘿,我想一起使用 Devise 和acts_as_audited 但是当我尝试使用链接它们时 -
class ApplicationController < ActionController::Base
audit Candidate
protected
def current_user
@user = User.find(user_session)
end
我得到这个错误。
stack level too deep
我需要做不同的事情吗?
谢谢
嘿,我想一起使用 Devise 和acts_as_audited 但是当我尝试使用链接它们时 -
class ApplicationController < ActionController::Base
audit Candidate
protected
def current_user
@user = User.find(user_session)
end
我得到这个错误。
stack level too deep
我需要做不同的事情吗?
谢谢
这是一个古老的问题,但仍然抬起了丑陋的头。这是一个不同的,可能更合适的解决方法,它对我有用。
首先,正如其他人所描述的,错误发生在将已审核(以前称为acts_as_audited)与设计(以及可能的其他身份验证 gem)一起使用时,然后当您审核设计在您的用户模型(last_sign_in_at、last_sign_in_ip 等)上使用的任何列时。
@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 方法,该方法类似于猴子修补,因为它可能会在以后导致意想不到的后果。
只是为了关闭它。
堆栈级别太深是因为 devise 内置了对 current_user 变量的审计。
因此,每次访问变量时都会导致无限循环。
进一步解释 - 在检查要忽略的内容之前,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 完成的审计以绕过验证、回调和时间戳的方式进行。
仅 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 ]