Rails + CanCan:禁止已经是成员的用户加入群组
Rails + CanCan: Disallow User from Joining a Group if Already a Member
我有一个 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的答案就可以了。
CanCan 块仅适用于模型实例(参见 this wiki page),现在您的 can?
发送模型 class,而不是实例。
为了使其工作,您需要传递一个成员身份实例。你可以这样做(假设@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 %>
我有一个 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的答案就可以了。
CanCan 块仅适用于模型实例(参见 this wiki page),现在您的 can?
发送模型 class,而不是实例。
为了使其工作,您需要传递一个成员身份实例。你可以这样做(假设@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 %>