使用带有cancan的Role表

时间:2014-08-22 12:13:04

标签: ruby-on-rails-4 cancan

每个用户都有一个角色。

用户:name :role_id

角色:name

user.rb

belongs_to :role

role.rb

has_many :users

ability.rb - 我希望这可以通过belongs_to / has_many关系工作 -

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user

    if user.role.name == "Admin"
      can :manage, :all
    end
  end
end

这是nilClass错误,但是如果失败了,为什么我使用以下内容获取“在UsersController#index中的ActiveRecord :: RecordNotFound - 找不到没有ID的角色”?

我以具有role_id:4的用户身份登录,这是名称的索引:“Admin”。

class Ability
  include CanCan::Ability

  def initialize(user)
     user ||= User.new # guest user

     if user.role_id = nil
       user.role_id = 5
     end

     if Role.find(user.role_id).name == "Admin"
       can :manage, :all
     end
  end
end

我认为在理解rails模型之间的关系时,我有一个非常重要的错误。

1 个答案:

答案 0 :(得分:0)

在你的app/models/user.rb中你应该有关系:

has_and_belongs_to_many :roles

同样的事情app/models/user.rb

has_and_belongs_to_many :users

请检查您的数据库中是否有rolesroles_users个表。 然后,您应该检查roles表中您想要的角色。 您可以在应用程序文件夹中rails console执行此操作:

1.8.7-p371 :005 > Role.find(:all, :select => 'id, name')
 => [#<Role id: 1, name: "super_admin">, #
     <Role id: 2, name: "owner">, #
     <Role id: 3, name: "admin">]

然后在app/models/ability.rb中你可以使用:

if user.role? :super_admin
    can :manage, :all
end

您可以在cancan wiki中找到更多信息: https://github.com/ryanb/cancan/wiki