不應該
if user.role?(x)
can :manage, Post
end
if user.role?(y)
can :manage, Article
end
夠嗎? cannot
只是刪除先前授予的權限。但是,如果你不授予他們,那麼你不需要刪除它們。
又見https://github.com/CanCanCommunity/cancancan/wiki/Ability-Precedence
這裏是一個正在運行的例子:
require 'cancan'
class Ability
include CanCan::Ability
attr_reader :user
def initialize(user)
@user = user
if user.role?(:editor)
can :edit, Post
end
if user.role?(:reader)
can :read, Post
end
end
end
class Post
end
class User
attr_reader :name
def initialize(name, *roles)
@name = name
@roles = roles
end
def role?(role)
@roles.include?(role)
end
end
admin = User.new('admin', :reader, :editor)
user = User.new('user', :reader)
editor = User.new('editor', :editor)
admin_ability = Ability.new(admin)
user_ability = Ability.new(user)
editor_ability = Ability.new(editor)
def output(ability, permission)
puts "#{ability.user.name} can #{permission} Post: #{ability.can?(permission, Post)}"
end
output(admin_ability, :edit)
output(user_ability, :edit)
output(editor_ability, :edit)
puts "--"
output(admin_ability, :read)
output(user_ability, :read)
output(editor_ability, :read)
默認是沒有權限。因此,如果您只能在添加權限的「添加」模式下工作,如果用戶具有角色,則永遠不需要刪除其中的一個。
:manage
與[:create, :edit, :update, :new, :destroy, :index, :show]
相同,僅爲方便起見。如果您只想添加其中的6個權限,則可以添加全部7個,然後刪除1.但除此之外,我認爲您不需要cannot
作爲示例。
爲什麼不在第二個'elsif'更好地建立優先級?這可能是第一次或最後一次通話,所以訂單可能一目瞭然。 – tadman
elsif不起作用。擁有兩個角色的用戶應具有兩種權限。 –