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 时,我在 AdminController#index 中出现 NoMethodError 错误(未定义的方法 `admin?' 用于 nil:NilClass)。帮助解决这个问题?我觉得可能有一个更优雅和安全的 CanCan 解决方案,但我还没有找到一个很好的解释来说明如何实现它。想法?提前致谢!

4

2 回答 2

0

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

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

然后放 before_filter :authenticate_user!在指数行动中。它会解决你的问题。您收到 nil 类错误,因为 current_user 变量未设置为用户未登录。

于 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 回答