2017-08-19 4 views
2

J'ai une politique de projet que seul super ou admin peut avoir accès.
Il ressemble à ceci maintenant:Dois-je définir toutes les méthodes dans la politique Pundit?

class ProjectPolicy < ApplicationPolicy 

    def index? 
    super_or_admin? 
    end 

    def new? 
    super_or_admin? 
    end 

    def create? 
    super_or_admin? 
    end 

    def update? 
    super_or_admin? 
    end 

    def show? 
    super_or_admin? 
    end 

    def super_or_admin? 
    user.role.name == 'superadmin' or user.role.name == 'admin' 
    end 
end 

Est-il possible d'avoir pundit appliquer automatiquement super_or_admin? à toutes les routes au lieu de définir chacun d'eux manuellement?

+0

ne suis pas sûr Pundit, mais si toutes ces méthodes sont en train d'appeler 'super_or_admin?', vous pouvez juste les alias tous: 'alias: index? : super_or_admin? 'et réduire le code de cette façon –

Répondre

0

Vous pouvez définir votre politique comme ceci:

class ProjectPolicy < ApplicationPolicy 
    def initialize(user, record) 
    raise Pundit::NotAuthorizedError.new(policy: 'project') unless super_or_admin? 
    end 

    def method_missing(name, *args) 
    true 
    end 

    def super_or_admin? 
    user.role.name == 'superadmin' or user.role.name == 'admin' 
    end 
end 

Il va vérifier les autorisations lors de l'initialisation. Définir method_missing dans ce cas est nécessaire, sinon vous recevrez NoMethodError pour des méthodes spécifiques à l'action (create?, update?, etc.). Mais vous n'avez pas besoin de les définir, car vous vérifiez les permissions dans la méthode initialize, qui sera appelée quand même.

Ensuite, si vous avez besoin d'autorisation dans toutes les actions, dans votre contrôleur ou il est ancêtre, vous pouvez définir:

include Pundit 

def authorize_project 
    authorize :project 
end 

Et utiliser before_action callback comme ceci:

before_action :authorize_project