设计/ cancan重定向管理员问题

时间:2013-07-02 03:42:17

标签: ruby-on-rails devise cancan

我有一个带有布尔开关的User模型来指定admin 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时,我在AdminController#index错误中得到NoM​​ethodError(未定义的方法`admin?'代表nil:NilClass)。有关这个问题的帮助?我觉得CanCan解决方案可能会更加优雅和安全,但我还没有找到如何实现这一目标的良好解释。思考?提前谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用资源而不是使用它更通用

def after_sign_in_path_for(资源)     if current_user.admin?         admin_index_path     其他         dashboard_index_path     结束   结束 和

然后放  before_filter:authenticate_user!在索引行动中。它会解决你的问题。 你得到了nil类错误,因为current_user变量没有设置为未登录的用户。