Rails - 设计和acts_as_audited

Ale*_*lex 3 ruby-on-rails acts-as-audited devise

嘿,我想一起使用 Devise 和 act_as_audited 但是当我尝试使用 -

class ApplicationController < ActionController::Base
 audit Candidate
 protected

 def current_user
   @user = User.find(user_session)    
 end
Run Code Online (Sandbox Code Playgroud)

我收到这个错误。

stack level too deep
Run Code Online (Sandbox Code Playgroud)

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

谢谢

MrD*_*erp 5

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

首先,正如其他人所描述的,当使用audise(以前称为acts_as_audited)和devise(以及潜在的其他身份验证gems)时会发生错误,然后当您审计Devise 在您的用户模型(last_sign_in_at、last_sign_in_ip 等)上使用的任何列时,就会发生错误。

  1. 设计尝试验证用户(使用其authenticate_user!before_filter)。
  2. Devise 尝试更新/保存用户的登录信息(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
Run Code Online (Sandbox Code Playgroud)

然后,在 config/initializers/audited.rb 中,告诉 Audited 使用您的新方法:

Audited.current_user_method = :my_cool_method
Run Code Online (Sandbox Code Playgroud)

通过此更改,Audited 仍将审核更改,但不会尝试设置审核的用户(进行更改的人)- 那将为零。

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