2012-04-23 6 views
0

はクラブのメンバーシップのためにhas_manyの関係を想像してみて:CanCanの機能を他のモデルに基づいて作成を制御するように構造化するにはどうすればよいですか?

end 
class Club < ActiveRecord::Base 
    has_many :memberships, :dependent => :destroy 
    has_many :users, :through => :memberships 
    validates :name, :is_enrollable, :presence => true 
end 
class Membership < ActiveRecord::Base 
    belongs_to :club 
end 

は、クラブがそのテーブルにブールis_enrollableフィールドを持っていることも想定します。真の場合、ユーザーはそのクラブに関連付けられたメンバーシップを作成することができます。 falseの場合、管理者だけがメンバーシップレコードを作成できます。

私の質問は、これを反映するためにCanCanのability.rbをどのように設定するのですか?

コメント:Clubテーブルのフィールドがメンバーシップレコードを作成する機能を制御するという点で、少し珍しいことです。これは動作しません:

can :create, Membership, :club => {:is_enrollable => true} 

...メンバーシップが作成される前に存在しないためです。 編集:それは本当ではない - CanCan は、それを許可する前に保存されていないレコードで動作します。以下の回答を参照してください。

答えて

0

(私はそれがひどくもたらされますので、この質問を引き出す上で計画していたが、私は答えを考え出し、それが役に立つかもしれないと思った。)

あなたがのための能力で句を作成することができます:それは読み込む作成します。

can :create, Membership, :club => {:is_enrollable => true} 

MembershipsControllerで、カンカンが効果的にやって、新しい(未保存)メンバーシップモデルを構築し、それを認可する、ので、これは動作します:

@membership = Membership.new(params[:membership]) 
raise <some error> unless Ability.new(user).can?(:create, @membership) 
# if we've gotten this far, we can now save the membership 
@membership.save 

少なくとも、それは私が行っていると思います。

関連する問題