0

管理者 t/f を指定するブール スイッチを持つユーザー モデルがあります。私の現在のアプリケーションコントローラ:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def after_sign_in_path_for(user)
    if current_user.admin?
        admin_index_path
    else
        dashboard_index_path
    end
  end
end

私の現在の管理コントローラー:

class AdminController < ApplicationController

    def index
        if current_user.admin?

            admin_index_path
        else

            home_index_path
        end
    end
end

目標はもちろん、管理者インデックス ページへのアクセスを管理者ユーザーのみに許可することです。管理者としてサインインするとリダイレクトは正常に機能しますが、管理者以外のユーザーとして admin_index_path に移動すると、NoMethodError in AdminController#index エラーが発生します (nil:NilClass の未定義メソッド「admin?」)。この問題について助けてください。おそらく、よりエレガントで安全な CanCan ソリューションがあるように感じますが、それを達成する方法についての適切な説明は見つかりませんでした。考え?前もって感謝します!

4

2 に答える 2

0

use の代わりに use resource はより一般的です

def after_sign_in_path_for(resource) if current_user.admin? admin_index_path でなければ、dashboard_index_path end end と

そして before_filter :authenticate_user を入れるだけです! インデックスアクションで。それはあなたの問題を解決します。current_user 変数がサインインしていないユーザーとして設定されていないため、nil クラス エラーが発生しました。

于 2013-07-02T06:07:46.270 に答える
0

before_filter を使用する

https://github.com/plataformatec/devise#controller-filters-and-helpers

class AdminController < ApplicationController

 before_filter :authenticate_user!, only: [:index]
 before_filter :is_admin, only: [:index]

 def index
 end

 private

  def is_admin
  if user_signed_in?
   if current_user.admin?
     true
   else
     redirect_to home_index_path
   end
  else
    redirect_to login_path
  end
 end

end

user_signed_in?ユーザーがサインインしていることを current_user.admin?確認し、インデックスにアクセスするときに管理者であることを確認します

また

def is_admin
 if current_user.nil?
  redirect_to login_path
 else
   if current_user.admin?
     true
   else
     redirect_to home_index_path
   end
 end
end
于 2013-07-02T04:30:20.470 に答える