1

Dashboard Controller で Devise を使用してユーザー、管理者、エージェントをブロックしようとしています - 次のエラーが表示されます:

DashboardController:Class の未定義のローカル変数またはメソッド「current_admin」

class DashboardController < ApplicationController
  if current_admin.present?
    before_filter :blocked_admin?
  elsif current_agent.present?
    before_filter :blocked_agent?
  elsif current_user.present?
    before_filter :blocked_user?
  end

  def blocked_admin?
    if current_admin.present? && current_admin.blocked_admin?
      sign_out current_admin
      redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
    end
  end

  def blocked_agent?
    if current_agent.present? && current_agent.blocked_agent?
      sign_out current_agent
      redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
    end
  end

  def blocked_user?
    if current_user.present? && current_user.blocked_user?
      sign_out current_user
      redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
    end
  end

end

私はレールを初めて使用します。(DRY) コードを最適化する最良の方法は何ですか。そして、私が上で述べたエラーを乗り切るために。

私もこれをやろうとしていますが、別の方法で「アプリケーションコントローラー」に配置しました。この行を削除する前に発生するエラー:

redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"

このアクションでレンダリングやリダイレクトが複数回呼び出されました。render または redirect のみを呼び出すことができ、アクションごとに最大 1 回しか呼び出せないことに注意してください。また、redirect も render もアクションの実行を終了しないことに注意してください。したがって、リダイレクト後にアクションを終了する場合は、「redirect_to(...) and return」のようなことを行う必要があります。

この行を削除した後

redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"

TrueClass:Class の未定義のメソッド `model_name'

  def after_sign_in_path_for(resource)
    if resource.is_a?(Admin) && resource.blocked_admin?
      sign_out current_admin
      redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
    elsif resource.is_a?(Agent) && resource.blocked_agent?
      sign_out current_agent
      redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
    elsif resource.is_a?(Agent) && resource.blocked_agent?
      sign_out current_user
      redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
    else
      #super
      "/dashboard"
    end
  end
4

2 に答える 2

2

認証にcancanのような外部 gem を使用することを検討することをお勧めします。非常に役立つドキュメント/スクリーンキャストが利用可能です。ニーズに合わないと思われる場合は、ここで利用可能なツールをいつでも確認できます。また、次のようなことを試すこともできます。

あなたのapplication_controller.rbで:

before_filter :check_for_blocking

def check_for_blocking
  if current_user.blocked?
    sign_out current_user
    redirect_to root_path, :notice => "This account has been Blocked - Please Contact Admin"
  end
end

直面する主な問題は、current_admin、current_agent を current_user に統合することです。そのためのロール管理が必要です-cancanまたは他の同様のロール認証gemが提供します。

于 2012-10-06T14:10:39.480 に答える
0

これらの3行を追加してみてください

before_filter :authenticate_user!
before_filter :authenticate_admin!
before_filter :authenticate_agent!
于 2012-10-07T10:44:40.403 に答える