2016-08-14 2 views
0

J'ai déjà utilisé le Pundit Gem auparavant, mais je n'ai jamais essayé de faire ce que j'essaie de faire maintenant, et pour une raison quelconque, Pundit n'est pas content. Ce que je veux faire, c'est d'avoir un modal avec le formulaire 'create' (Foo) sur ma page 'index' (Foos). J'ai donc besoin d'instancier un objet Foo vide pour que la forme modale fonctionne.Aucune règle Pundit trouvée dans Rails

Le problème que je rencontre, est que Pundit renvoie une erreur lorsque je soumets le formulaire à distance. L'erreur est:

Pundit :: NotDefinedError - incapable de trouver la politique de néant

J'ai essayé de comprendre pourquoi ce qui se passe mais je n'ai pas été en mesure de résoudre encore.

Voici mon foos_controller.rb index #:

... 
def index 
    @foo = Foo.new 
    authorize @foo, :new? 
    @foos = policy_scope(Foo) 
end 
... 

J'ai alors le filtre 'before_action' suivant qui fonctionne pour mes autres actions à savoir 'créer'

... 
before_action  :run_authorisation_check, except: [:index] 
def run_authorisation_check 
    authorize @foo 
end 
... 

Les politiques que je « utilise dans foo_policy.rb:

.... 
def index? 
    user.has_any_role? :super_admin 
end 

def create? 
    user.has_any_role? :super_admin 
end 

def new? 
    create? 
end 


def scope 
    Pundit.policy_scope!(user, record.class) 
end 

class Scope 
    attr_reader :user, :scope 

    def initialize(user, scope) 
    @user = user 
    @scope = scope 
    end 

    def resolve 
    if user.has_any_role? :super_admin 
     scope.all 
    end 
    end 
end 
.... 

l'erreur ne se présente pas jusqu'à ce que je soumets la forme. Est-ce que quelqu'un connaissant Pundit pourrait m'aider à comprendre ce que je fais de façon incorrecte?

MISE À JOUR

foos_controller.rb pleine

class FoosController < ApplicationController 


    def index 
    @foo = Foo.new 
    authorize @foo, :create? 
    @foos = policy_scope(Foo) 
    end 


    def new 
    @foo = Foo.new 
    end 


    def create 
    @foo = Foo.new(foo_params) 
    respond_to do |format| 
     if @foo.save 
     flash[:notice] = I18n.t("foo.flash.created") 
     format.json { render json: @foo, status: :ok } 
     else 
     format.json { render json: @foo.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    private 

    before_action  :run_authorisation_check, except: [:index] 

    def foo_params 
     params.fetch(:foo, {}).permit(:bar) 
    end 

    def run_authorisation_check 
     authorize @foo 
    end 
end 
+0

Il semble que vous ne pouvez pas être réglage de la valeur de votre '@ foo' , avant d'appeler la méthode ': run_authorisation_check', pourriez-vous montrer votre contrôleur complet? – oreoluwa

+0

@oreoluwa J'ai mis à jour ma question – Herm

Répondre

0

Oui, vous n'êtes pas définir la valeur de @foo, c'est la raison pour laquelle vous obtenez l'erreur unable to find policy of nil.

La plupart du temps, vous auriez quelque chose comme ça dans votre foos_controller.rb:

before_action :set_foo, only: [:show, :edit, :update, :destroy] 
before_action  :run_authorisation_check, except: [:index] 
... 
private 
    def set_foo 
    @foo = Foo.find(params[:id]) 
    end 

Laissez-moi savoir si cela fonctionne

+0

Comment puis-je définir @foo avec une méthode: new ou: create? Cela attend généralement une instance vide ... Ou est-ce que je manque complètement quelque chose? – Herm