ない
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
が必要と思われます。
優先度をより良くするには、2番目に 'elsif'を使用してみませんか?最初のコールまたは最後のコールがスティックされる可能性があるので、一目でその順序がはっきりしないことがあります。 – tadman
elsifは機能しません。両方の役割を持つユーザーは、両方の権限を持つ必要があります。 –