Раньше я использовал Pundit Gem, но я никогда не пробовал делать то, что я пытаюсь сделать сейчас, и почему-то Pundit недоволен.В Rails нет политики Pundit
То, что я собираюсь сделать, состоит в том, чтобы иметь модальную форму «создать» (Foo) на моей странице «индекс» (Foos). Таким образом, мне нужно создать экземпляр пустого объекта Foo для работы модальной формы.
Проблема, с которой я столкнулся, заключается в том, что Pundit выдает ошибку, когда я отправляю форму удаленно. Ошибка:
Пандит :: NotDefinedError - не удалось найти политику нолю
Я попытался понять, почему это происходит, но я не смог решить еще.
Вот мой foos_controller.rb # индекс:
...
def index
@foo = Foo.new
authorize @foo, :new?
@foos = policy_scope(Foo)
end
...
Я тогда следующий фильтр «before_action», который работает для других моих действий, то есть «создать»
...
before_action :run_authorisation_check, except: [:index]
def run_authorisation_check
authorize @foo
end
...
Политики, которые я Используется в 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
....
Ошибка не появляется, пока я не отправлю форма. Может ли кто-нибудь, знакомый с Pundit, помочь мне помочь понять, что я делаю неправильно?
UPDATE
Полный foos_controller.rb
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
Кажется, вы не может быть установлен в значение вашего '@ Foo' , перед вызовом метода ': run_authorisation_check', вы можете показать свой полный контроллер? – oreoluwa
@oreoluwa Я обновил свой вопрос – Herm