如何配置pundit来显示属于父键的项目

时间:2016-10-19 04:49:33

标签: ruby-on-rails pundit rolify

我的用例是,如果用户有角色:agency,他就可以看到客户端。但我必须使用客户端和代理商之间的链接来验证这一点。看下面看看我的代码:

class Agency < ApplicationRecord
  has_many :agency_clients
  has_many :clients, through: :agency_clients

  resourcify
end

class AgencyClient < ActiveRecord::Base
  belongs_to :agency
  belongs_to :client
end

class Client < ApplicationRecord
  has_many :agency_clients
  has_many :agencies, through: :agency_clients

  resourcify
end


class ClientPolicy < ApplicationPolicy
  def show?
    user.has_role?(:admin) || user.has_role?(:client, record)
  end

  class Scope < Scope
    def resolve
      if user.has_role? :admin
        scope.all
      elsif user.has_role? :client, :any
        scope.with_role(:client, user)
      else
        scope.none
      end
    end
  end
end

谢谢!

1 个答案:

答案 0 :(得分:0)

这种方式解决了我的问题。我希望它能帮助别人。

我的模型Agency有很多Clients

class Agency < ApplicationRecord
  has_many :clients

  resourcify
end

我的User有关系:

class User < ApplicationRecord
  has_many :users_roles
  has_many :roles, through: :users_roles
  has_many :agencies, through: :roles, source: :resource, source_type: 'Agency'

  rolify

  ...
end

需要创建UsersRole模型:

class UsersRole < ApplicationRecord
  belongs_to :user
  belongs_to :role
end

最后,我的ClientPolicy

class ClientPolicy < ApplicationPolicy
  def show?
    user.has_role?(:admin) || user.has_role?(:client, record)
  end

  class Scope < Scope
    def resolve
      if user.has_role? :admin
        scope.all
      elsif user.has_role? :client, :any
        scope.with_role(:client, user)
      elsif user.has_role? :agency, :any
        scope.where(agency_id: user.agencies.pluck(:id))
      else
        scope.none
      end
    end
  end
end