2011-10-26 27 views
10

我不知道我該怎麼定義的能力一流,服務這種能力類取決於已登錄的用戶。Rails可以燦能力類多設計模型

我使用主動聯繫,可以可以和設計並且我已經成功創建了一個User和一個AdminUser模型。

我有這個在我的ability.rb現在

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if (user) 
     can :manage, Item 
    end 
    end 
end 

我已經使用這個維基條目,以確定我們確實可以定義自定義能力文件,並用它來代替的ability.rb:

https://github.com/ryanb/cancan/wiki/changing-defaults

但我想要做的是,能夠使用ability.rb如果「非管理員用戶」在簽署和自定義abilty如果用戶管理中籤署。

支持問題:是否可以這樣做,我不需要自定義的,我可以在一個ability.rb文件中設置權限?

+0

啊,你說得對。我沒有注意到你已經爲User和AdminUser使用了一個單獨的類。您應該能夠更改Active Admin使用的類,但不能成爲該系統的用戶,我不確定具體位置。可能應該檢查你的初始值。 – jdl

回答

12

我從來沒有真正使用過ActiveAdmin,所以我不完全確定我是否錯過了某些東西,但似乎並沒有那個框架依賴於CanCan。這就是爲什麼我假設你正在定義一個current_ability方法,就像在維基中解釋的一樣,它的實例化爲Ability.new(current_user)

如果是這樣的話,你的current_user可以是UserAdminUser,那麼就在Ability類爲該檢查沒有問題:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.kind_of? AdminUser 
     can :manage, Item 
    elsif user.kind_of? User 
     can :read, Item 
    end 
    end 
end 

你可以簡單地看看用戶鍵入並相應地更改規則。您也可以使用is_a?而不是kind_of?進行更嚴格的檢查,但如果您稍後決定繼承,則可能不需要,並且可能會導致問題。

您可以檢查的另一種方法是在兩個模型中定義一個admin?方法。這可能是更好的方法,因爲明確的類型檢查在ruby中不太流行 - 它經常會限制你的選擇。它可能看起來像這樣:

class User < ActiveRecord::Base 
    def admin? 
    false 
    end 
end 

class AdminUser < ActiveRecord::Base 
    def admin? 
    true 
    end 
end 

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.admin? 
     can :manage, Item 
    else 
     can :read, Item 
    end 
    end 
end