0

想象一下俱乐部会员的 has_many 关系:

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

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

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

评论:有点不寻常的是,Club 表中的一个字段控制着创建会员记录的能力。这不起作用:

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

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

4

1 回答 1

0

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

您可以在 Ability for :create 中创建一个子句,内容如下:

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

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

@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

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

于 2012-04-23T22:31:11.430 回答