我有一个带有布尔开关的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错误中得到NoMethodError(未定义的方法`admin?'代表nil:NilClass)。有关这个问题的帮助?我觉得CanCan解决方案可能会更加优雅和安全,但我还没有找到如何实现这一目标的良好解释。思考?提前谢谢!
答案 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变量没有设置为未登录的用户。