【问题标题】:how do I structure CanCan abilities to control creation based on another model?如何构建 CanCan 能力以控制基于另一个模型的创建?
【发布时间】:2012-04-23 07:18:24
【问题描述】:

想象一下俱乐部会员的 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

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails-3 cancan


    【解决方案1】:

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

    您可以在 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
    

    至少,我认为是这样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2021-11-01
      • 1970-01-01
      • 2022-12-11
      • 2011-07-01
      相关资源
      最近更新 更多