2011-02-13 2 views
2

レコード管理システムを作りたい。システムには、4種類のユーザーロール(Admin,Viewer,EditorReviewer)があります。RoR:新しく作成されたレコードごとにユーザー役割が異なりますか?

最初の二つは、カンカン宣言認可などの宝石を使用して実装することが容易であるが、他の2つはそれほど単純ではありません。

基本的には、新しいレコードはAdminで作成されます(管理者だけが新しいレコードを作成できます)。独自の個別のEditorReviewerの役割を持つ必要があります。それはエディタ

    • で、ユーザは、などユーザーが録音AとCのための Editor役割を割り当てられますがBではないかもしれない、別のレコードではなく、他に多くの異なる役割を割り当てることができますへの変更を行うことができます編集などのコントローラー内の特定のメソッドにアクセスできるようになります。

    • レビュアー:レコードに加えられた変更を確認し、コメントを送信したりコメントを投稿したり却下したりすることができます。

    • ビューア:各レコードの最新の承認済みバージョンのみを表示できます。

    このようなレコード固有のユーザーロールを処理する方法はありますか?

  • 答えて

    3

    これは、cancan gemとブロック条件で多大な労力を費やすことなく達成できます。ブロック条件は、インスタンスに対する認可をチェックします。あなたRecordクラスは、レコードを更新するためのカンカン能力は、このようになります認可エディタの配列を返すエディタメソッドを持っていたと仮定すると:

    class Ability 
        include CanCan::Ability 
    
        def initialize(user) 
        user ||= User.new # guest user (not logged in) 
    
        ... 
    
        can :update, Record do |record| 
         record.editors.include?(user) 
        end 
    
        ...  
    
        end 
    end 
    

    カンカンのwikiに「ブロック条件」を参照してください。 https://github.com/ryanb/cancan/wiki/Defining-Abilities

    更新

    特定のニーズに応じて、どのユーザーがどのレコードにアクセスできるかはさまざまな方法で保存できます。一つの方法は、役割の割り当てを保存するために、このようなモデルを作成することがあります:すべての役割の割り当てを簡単に照会できるように

    class UserRecordRoles < ActiveRecord::Base 
        # Has three fields: role, user_id, record_id 
        attr_accessible :role, :user_id, :record_id 
        belongs_to :user_id 
        belongs_to :record_id 
    end 
    

    今すぐユーザーとレコードモデルでhas_manyの関連付けを作成します。編集方法は次のようになります。もちろん

    class Record < ActiveRecord::Base 
    
        ... 
    
        has_many :user_record_roles 
    
        def editors 
        # This is rather messy and requires lot's of DB calls... 
        user_record_roles.where(:role => 'editor').collect {|a| a.user} 
        # This would be a single DB call but I'm not sure this would work. Maybe someone else can chime in? Would look cleaner with a scope probably. 
        User.joins(:user_record_roles).where('user_record_roles.role = ?' => 'editor') 
        end 
    
        ... 
    
    end 
    

    がこれを行うには、多くの多くの方法があり、それは乱暴にあなたのニーズによって異なります。アイデアは、許可を決定する際にCanCanがあなたのモデルと話すことができます。これは、あなたが夢見ることができるロジックを表現できることを意味します。お役に立てれば!

    +0

    答えをいただきありがとうございます。作成されたレコードの新しいロールを作成する方法と、ロールをユーザーに割り当てる方法を教えてください。私が尋ねるのは、エディタメソッドはどのように機能するのでしょうか? –

    +0

    @Mo大歓迎です。私は私の答えを更新します... – MDaubs

    +0

    @もう少し複雑になっていますが、十分にはっきりしていることを願っています。実際にロールを格納することは、アプリケーション固有です。あなたのプロジェクトにとって何が合理的であれ、それは道のりです。アプリケーションに最も合ったものを見つけたら、CanCanにアプリケーションの仕組みを伝え、それらの 'can 'メソッドをアプリケーションに振りかざしてください。誰かが私の '編集者 '方法をより良くすることができるなら、私は非常に興味があります!それは私に悪いにおいがする。 – MDaubs

    関連する問題