如何基于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_usersendclass 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)) endendclass GroupUser < ActiveRecord::Base belongs_to :user belongs_to :groupend
CanCan能力.请注意,它在Group上使用owner方法.
class Ability include CanCan::Ability def initialize(user) can :update,Group do |group| group.owners.include?(user) end endend
视图如下.在这里,无法看到链接的用户仍然可以看到它.
<ul > <% @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.groupsend
. . .
有趣的是,即使它在实际使用中不起作用,下面的单元测试也会通过:
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.
总结以上是内存溢出为你收集整理的ruby-on-rails – 使用CanCan在Rails 4上授权用户在连接表中使用一个角色全部内容,希望文章能够帮你解决ruby-on-rails – 使用CanCan在Rails 4上授权用户在连接表中使用一个角色所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)