使用cancan获取未定义的局部变量或方法`roles'

时间:2011-08-11 05:05:57

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

我已经放弃了尝试锁定应用程序中的每个操作。目前我在除设计/注册之外的每个控制器中放置:

load_and_authorize_resource
用户模型中的

  def role?(role)
    roles.include? role.to_s
  end

在能力模型中:

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

但是,我收到以下错误:

undefined local variable or method `roles'
app/models/user.rb:33:in `role?'
app/models/ability.rb:7:in `initialize'

感谢您的帮助。

更新:由于Bohdan在下面的回答,我进一步研究了文档,发现有不同的方法来设置cancan模型。目前我们有6个不同的角色,导致数据库中有6个不同的布尔字段。我正在考虑一种分层方法来定义角色,其中一个用户可以拥有多个角色,一个角色拥有许多用户。有两种方法可以设置角色定义。 FirstSecond。为了便于使用,我认为我会详尽地定义每个角色,因此每个人只有一个角色。想知道它的缺点是什么。

更新:我注释掉了除上面定义的superadmin之外的所有其他角色。意识到它与许多问题没有任何关系。所以...?

2 个答案:

答案 0 :(得分:2)

您的模型中应该有has_and_belongs_to_many :roles或方法roles

的任何其他自定义定义

修改

has_and_belongs_to_many :roles添加到User模型后,使您需要的所有内容

定义名为Role且至少具有name属性

的新模型

变化

def role?(role)
  roles.include? role.to_s
end

def role?(role)
  roles.map(&:name).include? role.to_s
end

修改

迁移

class CreateRolesUsers < ActiveRecord::Migration
  def self.up
    create_table :roles_users do |t|
      t.integer :user_id
      t.integer :role_id
    end
  end

  def self.down
    drop_table :roles_users
  end
end

只需添加此迁移,然后运行rake db:migrate rails将完成剩下的工作

答案 1 :(得分:0)

rails HBTM关系按字母顺序排列表名。尝试将迁移更改为

create_table :user_roles