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
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
@oreoluwa J'ai mis à jour ma question – Herm