これは、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があなたのモデルと話すことができます。これは、あなたが夢見ることができるロジックを表現できることを意味します。お役に立てれば!
答えをいただきありがとうございます。作成されたレコードの新しいロールを作成する方法と、ロールをユーザーに割り当てる方法を教えてください。私が尋ねるのは、エディタメソッドはどのように機能するのでしょうか? –
@Mo大歓迎です。私は私の答えを更新します... – MDaubs
@もう少し複雑になっていますが、十分にはっきりしていることを願っています。実際にロールを格納することは、アプリケーション固有です。あなたのプロジェクトにとって何が合理的であれ、それは道のりです。アプリケーションに最も合ったものを見つけたら、CanCanにアプリケーションの仕組みを伝え、それらの 'can 'メソッドをアプリケーションに振りかざしてください。誰かが私の '編集者 '方法をより良くすることができるなら、私は非常に興味があります!それは私に悪いにおいがする。 – MDaubs