了解CanCan能力和用户

时间:2013-04-02 22:17:42

标签: ruby-on-rails ruby-on-rails-3 cancan rails-admin

我在我的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?我是否必须手动创建它?

2 个答案:

答案 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