2011-12-14 113 views
0

在我的應用程序中,我希望以這種方式實現角色和權限,即用戶管理員可以在其瀏覽器中創建新角色。所以我需要權限表和角色表,其中每個角色都是權限的組合。現在我使用了CanCan gem,但這種行爲並不是這個gem的默認行爲,最終我得到了非常複雜的角色結構和權限檢查。任何人都可以告訴我什麼寶石提供這種行爲,或者我應該沒有任何寶石?存儲在數據庫,導軌中的權限和角色3.1

回答

1

Abilities in DatabaseAbility for Other Users從康康舞維基:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    can do |action, subject_class, subject| 
     user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission| 
     permission.subject_class == subject_class.to_s && 
      (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id) 
     end 
    end 
    end 
end 

編輯
一些負載優化:

class Ability 
    include CanCan::Ability 

    def initialize(user, context = nil) 
    if context.nil? 
     can do |action, subject_class, subject| 
     user.permissions.find_all_by_action(aliases_for_action(action)).any? do |permission| 
      permission.subject_class == subject_class.to_s && 
      (subject.nil? || permission.subject_id.nil? || permission.subject_id == subject.id) 
     end 
    elsif context == :post 
     can :manage, Post, :id => y 
    elsif context == :users 
     can :manage, User, :id => x 
    end 
    ... 

並在控制器:

class UsersController 
    protected 
    def current_ability 
    Ability.new(current_user, :users) 

class PostsController 
    protected 
    def current_ability 
    Ability.new(current_user, :posts) 
+0

是的,我實現它像這現在,但它太多了當頁面加載時任務到DB。我想知道是否有更合適的方法來做到這一點。 – 2011-12-14 14:03:20