想象一下俱乐部会员资格的关系:
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 将处理未保存的记录。请参阅下面的答案。
答案 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
至少,这就是我的想法。