2016-10-19 4 views
0

Mon cas d'utilisation est que, si l'utilisateur a le rôle :agency, il peut voir les clients. Mais je dois utiliser le lien entre le client et l'agence pour le vérifier. Jetez un oeil ci-dessous pour voir mon code:Comment configurer Pundit pour afficher les éléments appartenant à une liaison parente

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 

Merci!

Répondre

0

De cette façon, j'ai résolu mon problème. J'espère que ça aide les autres.

Mon modèle Agency a beaucoup Clients:

class Agency < ApplicationRecord 
    has_many :clients 

    resourcify 
end 

Mes User ont des relations:

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 

besoin de créer le modèle UsersRole:

class UsersRole < ApplicationRecord 
    belongs_to :user 
    belongs_to :role 
end 

Enfin, mon 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