如何构建CanCan能力来控制基于另一个模型的创建?

时间:2012-04-23 07:18:24

标签: ruby-on-rails-3 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

假设Club在其表中有一个布尔is_enrollable字段。如果为true,则用户可以创建与该俱乐部关联的成员资格。如果为false,则只有管理员可以创建成员资格记录。

我的问题是:你如何设置CanCan的能力.rb来反映这一点?

评论:Club表中的字段控制创建成员资格记录的能力,这有点不寻常。这不起作用:

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

...因为会员资格在创建之前不存在。 编辑:那不是真的 - 在授权之前,CanCan 处理未保存的记录。请参阅下面的答案。

1 个答案:

答案 0 :(得分:0)

(我打算撤回这个问题,因为这个问题很糟糕,但我找到答案并认为它可能有用。)

您可以在“能力:创建”中创建一个条目:

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

这是有效的,因为在MembershipsController中,CanCan将构建一个新的(未保存的)Membership模型,然后对其进行授权,有效地执行:

@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

至少,这就是我的想法。