ruby-on-rails – 使用CanCan在Rails 4上授权用户在连接表中使用
发布时间:2020-12-17 02:21:36 所属栏目:百科 来源:网络整理
导读:我正在使用Rails 4.0.0,ruby 2.0.0p247和CanCan 1.6.10. 如何基于CanCan在连接表中的角色授权用户(has_many:through)? 我有3个模型:User,Group和GroupUser. 用户和组通过GroupUser表关联为has_many.每个GroupUser还有一个角色字段,可以是“编辑者”或“所
我正在使用Rails 4.0.0,ruby 2.0.0p247和CanCan 1.6.10.
如何基于CanCan在连接表中的角色授权用户(has_many:through)? 我有3个模型:User,Group和GroupUser. 用户和组通过GroupUser表关联为has_many.每个GroupUser还有一个角色字段,可以是“编辑者”或“所有者”.一个组可以有多个用户,每个用户具有不同的角色.此外,用户可以在多个组中拥有角色. 我有使用CanCan功能的应用程序设置,但它不是仅限制具有正确角色的用户的访问权限,而是授权所有人. 模型设置如下.另请注意,Group有一种方法可以返回其所有者列表. class User < ActiveRecord::Base has_many :group_users has_many :groups,through: :group_users end class Group < ActiveRecord::Base has_many :group_users has_many :users,through: :group_users def owners User.find(self.group_users.where(role: 'owner').map(&:user_id)) end end class GroupUser < ActiveRecord::Base belongs_to :user belongs_to :group end CanCan能力.请注意,它在Group上使用owner方法. class Ability include CanCan::Ability def initialize(user) can :update,Group do |group| group.owners.include?(user) end end end 视图如下.在这里,无法看到链接的用户仍然可以看到它. <ul class="groups"> <% @groups.each do |group| %> <li> <p><%= group.name %></p> <% if can? :update,Group %> <%= link_to "Edit",edit_group_path(group) %> <% end %> </li> <% end %> </ul> 最后,视图的Controller操作是: def index @groups = current_user.groups end . . . test 'user can only update groups they own' do ability_one = Ability.new(users(:one)) # Owner ability_two = Ability.new(users(:two)) # Not-owner assert ability_one.can?(:update,groups(:one)) assert ability_two.cannot?(:update,groups(:two)) end 解决方法
我认为你应该让cancan在这里使用真实对象,将实际的组对象传递给can?方法而不是Group类:
在视图中: <% if can? :update,group %> 代替: <% if can? :update,Group %> 这样,如果current_user能够:更新实际组,您将询问cancan.由于没有为通用Group对象设置操作的能力,因此第二个条件将始终为true. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |