2016-10-20 18 views
0

私はCanCan Gemを使用しており、競合する2つのロールをユーザーに割り当てることを希望します。私は2つの役割、1つはx役割、もう1つはy役割を持つユーザーが必要です。ロールxでは、ユーザーは投稿を作成できますが、記事を作成することはできません。役割yを使用すると、ユーザーは記事を作成できますが、投稿は作成できません。競合するCanCanロールの割り当て

私ability.rbファイルは次のようなものです:

if user.role?(x) 
    can :manage, Post 
    cannot :manage, Article 
end 
if user.role?(y) 
cannot :manage, Post 
can :manage, Article 
end 

私はユーザーが両方の役割を割り当てると、現在、ロールYの権限は、ロールXの権限を上書きします。管理者にロールを積み重ねて、ロールxとyをユーザーに追加したい場合、そのユーザーは投稿と記事を管理できるようにしたいと考えています。したがって、役割に缶があり、他の役割ではできない場合は、缶の許可が無効になります。

+0

優先度をより良くするには、2番目に 'elsif'を使用してみませんか?最初のコールまたは最後のコールがスティックされる可能性があるので、一目でその順序がはっきりしないことがあります。 – tadman

+0

elsifは機能しません。両方の役割を持つユーザーは、両方の権限を持つ必要があります。 –

答えて

1

ない

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が必要と思われます。

+0

一部のユーザーはロールxにしか所属せず、アーティクルの管理を許可すべきではなく、一部のユーザーはロールYにしか所属せず、ポストの管理を許可すべきではありません。投稿と記事を管理できる別の役割zを作成することはできません。 –

+0

私が本当にやりたいことを知りたいのは、コードを整理してユーザの全パーミッションを取ることができ、もし私がリソースを持っていてもできないのであれば、私はそれを取って、それを取り除くことはできません。だから、私は残っている唯一のcannotsは、同じリソースに対して反対のcanを持たないパーミッションのためのパーミッションのリストが残っています。 –

+0

私の更新を見てください。権限を削除する必要はありません。 –

関連する問題