2012-04-23 50 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 

至少,這是我認爲正在發生的事情。

相關問題