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

至少,这是我认为正在发生的事情。

相关问题