CanCanCan权限针对has_and_belongs_to_many关联的应用

4

我在用户(User)和客户端(Client)之间建立了has_and_belongs_to_many关联。clients_users表格拥有User和Client的索引。 我的模型如下:

class User < ActiveRecord::Base
  rolify
  has_and_belongs_to_many :clients
end

class Client < ActiveRecord::Base
  resourcify
  has_and_belongs_to_many :users
end

我的控制器如下:

class Admin::ClientsController < ApplicationController
  load_and_authorize_resource
end

class Admin::UsersController < ApplicationController
  load_and_authorize_resource
end

我需要在我的ability.rb文件中添加类似以下内容的代码。
user ||= User.new # guest user (not logged in)

can :read, :all
can :manage, Client, :clients_users => { :user_id => user.id }

只有在clients_users表中存在一个用户ID和该客户端的ID记录时,我才能管理客户端。我该如何让它工作?


可以这样做:can :manage, Client do |p| c.clients_users.user_id == user.id end - Sonalkumar sute
应该使用 |c| 而不是 |p|,但即使如此它仍然无法工作(更多信息请参见已接受的答案)。无论如何,谢谢。 - yazoou
1个回答

6
当你使用 has_and_belongs_to_many 时,你没有访问联接模型的权限,因为没有联接模型,如果您想要访问它,则需要使用 has_many :through
但在您的情况下,您实际上不需要访问联接模型,因为 Client 有一个 users 属性,而 User 有一个 clients 属性,那么为什么不直接使用它呢?
我认为这样做应该可以起作用。
can :manage, Client, id: user.clients.pluck(:id)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接