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

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

ただし、ヒットしたくない他のいくつかのコールバックをまだヒットしています。これは act_as_audited の問題ではなく、authlogic の問題です。

最終的には、devise または authlogic によって行われる監査が、検証、コールバック、およびタイムスタンプをバイパスする方法で行われることを望みます。

于 2011-07-11T21:20:33.083 に答える
0

Authlogic だけでも同じことが起こります。解決策は、次のフィールドに :except 引数を追加することです (以下を参照)。おそらく、Devise でも同様のことが機能するでしょう。

# それ以外の場合は明示的に定義する "Stack Level Too Deep"

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 に答える