2016-10-20 83 views
0

我正在使用CanCan Gem並且想要爲用戶分配兩個衝突的角色。我需要一個用戶有兩個角色,一個是x角色,另一個角色是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添加到用戶,該用戶將能夠管理帖子和文章。因此,如果角色擁有一個罐頭,而另一個角色擁有一個罐頭,則can權限將​​被覆蓋。

+0

爲什麼不在第二個'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

我真正想知道該怎麼做的是組織代碼,這樣我就可以獲得用戶的全部權限,如果我有一個罐頭,而不能爲一個資源,我拿罐頭,並刪除不能。所以最後我留下了一個權限列表,其中剩下的唯一權限是針對相同資源沒有反對權限的權限。 –

+0

查看我的更新。您不需要刪除權限。 –