2010-08-03 43 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