2016-10-25 3 views
1

Je reçois un "Pundit :: PolicyScopingNotPerformedError" lors de l'appel d'une requête GET à la méthode show de ce contrôleur. Toute aide appréciée.Rails Pundit Autorisation non effectuée

Controller:

class DashboardsController < ApplicationController 
    before_action :authorize_dashboard_for_customer, only: :show 
    after_action :verify_authorized, except: :index 
    after_action :verify_policy_scoped, only: :show 

    expose(:dashboards) { 
    Customer.find(params[:customer_id]).dashboards 
    } 

    expose(:dashboard) { 
    Dashboard.find(params[:id]) 
    } 

    expose(:customer) { 
    Customer.find(params[:customer_id]) 
    } 

    def index 
    end 

    def show 
    end 



    private 

    def authorize_dashboard_for_customer 
    authorize dashboard, :show? 
    end 
end 

Voici la politique Pundit:

class DashboardPolicy < ApplicationPolicy 

    def index? 
    show? 
    end 

    def show? 
    customer = user.try(:customer) 
    return false if customer.blank? 

    @record.customers.present? && @record.customers.include?(customer) || user.role == 'admin' 
    end 
end 

J'ai lu d'autres messages à ce sujet, mais encore de ne pas voir ce que je fais mal ici. Je ne sais toujours pas ce que fait la résolution d'une portée de stratégie, mais dans ce cas, je peux voir à partir des instructions de débogage que la stratégie est en cours d'exécution, donc je ne suis pas sûr de la nature du problème.

Répondre

1

Dans votre contrôleur, vous vérifiez que la portée de la stratégie est appelée avec after_action :verify_policy_scoped, only: :show mais que vous n'appelez rien pour l'étendue de votre action.

Vous pouvez utiliser Scopes pour restreindre les résultats en fonction des autorisations des utilisateurs connectés. Par exemple, un utilisateur admin sur un écran d'index verrait probablement tous les résultats, mais un non-administrateur pourrait peut-être voir seulement certains enregistrements. IMO vous ne devriez pas avoir besoin d'étendues sur un spectacle, donc vous devriez être en mesure de supprimer le verify_policy_scoped.

+0

Merci - cela aide certains. @Scott - vous dites _mais vous n'appelez rien pour la portée de votre action_ - est-ce que j'appellerais cette portée dans la méthode de la politique ou dans la méthode du contrôleur? – Andrew

+0

@andrew Vous allez ajouter la classe de portée à votre classe de politique, puis l'appeler du contrôleur pour récupérer les enregistrements. – Scott