【问题标题】:Rails + CanCan: Disallow User from Joining a Group if Already a MemberRails + CanCan:如果已经是成员,则禁止用户加入组
【发布时间】:2015-01-26 01:29:48
【问题描述】:

我有一个 Rails 应用程序,使用 CanCan 进行授权。我有可以在组中拥有成员资格的用户。我想创建一个 CanCan 规则,该规则仅在用户还不是该组的成员时才授权用户创建组成员资格。到目前为止,我一直无法弄清楚魔法:

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :members, :through => :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :member, class_name: 'User'
  belongs_to :group
end

class User < ActiveRecord::Base
  has_many :groups, through: :memberships
  has_many :memberships, foreign_key: 'member_id'
end

class Ability
  include CanCan::Ability

  def initialize(user)

    user ||= User.new

    # One of my sad attempts...
    can :create, Membership do |membership|
      !membership.group.has_member(user)
    end

  end

end

<% if can? :create, Membership %>
   View code for creating memberships...
<% end %>

感谢您的协助。另外,我知道 CanCanCan 是 CanCan 的继承者。一个 CanCanCan 的答案就可以了。

【问题讨论】:

  • 从这个wiki你可能想试试can :create, Membership, Membership do |membership|
  • 如果你有一个很好的例子。

标签: ruby-on-rails authorization cancan cancancan


【解决方案1】:

CanCan 块仅适用于模型实例(请参阅 this wiki page),现在您的 can? 发送模型类,而不是实例。

为了使其工作,您需要传递一个 Membership 实例。你可以这样做(假设@group 是用户想要加入的组)

<% if can? :create, Membership.new(group: @group) %>
   View code for creating memberships...
<% end %>

不过,我建议您将该能力放在小组中。在我看来,这是一种更直接的方法。

ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    can :join, Group do |group|
      !group.members.include?(user)
    end
  end
end

查看

<% if can? :join, @group %>
   View code for creating memberships...
<% end %>

【讨论】:

  • 您的第一个答案对我不起作用-可能与我定义的其他规则发生冲突。您的第二个首选答案就可以解决问题!
  • 我认为第二个答案可以由精明的用户和 HTTP 客户端解决。我想我需要让你的第一个答案努力防止这种情况发生。更新:让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 2023-04-01
  • 2019-10-13
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多