2011-12-14 9 views
0

私のアプリでは、そのような方法でロールとパーミッションを実装したいので、ユーザー管理者はブラウザに新しいロールを作成できます。だから、私はすべてのロールが許可の組み合わせであるパー​​ミッションテーブルとロールテーブルが必要です。今はCanCanの宝石を使用していましたが、この動作はこの宝石にとってはデフォルトではなく、ついに非常に複雑な構造のロールと権限の確認があります。誰も私に宝石がこの行動を提供するかどうかを教えてもらえますか、それとも宝石なしでそれを作るべきでしょうか?DB、レールに保存されたパーミッションとロール3.1

答えて

1

はカンカンのwikiから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 

EDIT
いくつかの負荷の最適化:

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へのクエストは、ページの読み込み時に発生します。私はこれを行うための適切な方法があることを知りたい。 –

+0

あなたはメモリ内のパーミッションテーブルを作成したり、2番目のコンテキスト変数を能力コンストラクタに渡したり、コンテキストに基づいてコンテキストを読み込み、古典的なCanCanを使用してそれらを定義することができます – clyfe

+0

これは最も簡単な方法です。そうする必要があります。ありがとう –

関連する問題