我已经放弃了尝试锁定应用程序中的每个操作。目前我在除设计/注册之外的每个控制器中放置:
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个不同的布尔字段。我正在考虑一种分层方法来定义角色,其中一个用户可以拥有多个角色,一个角色拥有许多用户。有两种方法可以设置角色定义。 First。 Second。为了便于使用,我认为我会详尽地定义每个角色,因此每个人只有一个角色。想知道它的缺点是什么。
更新:我注释掉了除上面定义的superadmin之外的所有其他角色。意识到它与许多问题没有任何关系。所以...?
答案 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