我在我的rails应用程序中拥有可以支持CanCan的Rails管理员。我对一个问题感到困惑。 CanCan如何知道用户登录的用户?例如,我的用户可以拥有不同的角色,通过CanCan,我可以为每个表分配特定访问权限的角色。当我转到localhost:3000/admin
时,收到错误
CanCan::AccessDenied in RailsAdmin::MainController#dashboard
我的Ability.rb
文件
def initialize(user)
if user and user.role.eql? :super_admin
can :manage, :all # allow superadmins to do anything
elsif user and user.role.eql? :admin
can :manage, [Location, School] # allow admins to manage only Locations and Schools
end
end
那么我该怎么做才能让用户能够登录Rails Admin?我是否必须手动创建它?
答案 0 :(得分:2)
默认情况下,CanCan将使用current_user
返回的任何内容。如果您在命名空间中使用Devise(例如admin
),那么Devise实际上将使用current_admin_user
。您可以在ApplicationController(或其他一些基本控制器)中创建一个current_user
方法,该方法返回current_admin_user
或覆盖current_ability
方法以使用current_admin_user
来实例化。 / p>
(这是假设您的Devise正在使用命名空间。默认情况下,Devise将使用current_user
)
答案 1 :(得分:1)
您需要在控制器中使用current_user
方法。假设你有这个,如果你没有签名,你将无权访问当前用户,因此如果用户不存在,你需要在你的能力文件中分配一个用户。在initialize
方法中,如果用户尚不存在,请添加user ||= User.new
以进行分配。
def initialize(user)
user ||= User.new
if user and user.role.eql? :super_admin
can :manage, :all # allow superadmins to do anything
elsif user and user.role.eql? :admin
can :manage, [Location, School] # allow admins to manage only Locations and Schools
end
end