Ruby on rails Rails:在Rails中找不到权威策略
我以前用过这个,但我从来没有试过做我现在想做的事情,出于某种原因,权威人士不高兴 我的目标是在我的“索引”(Foos)页面上创建一个带有“创建”(Foo)表单的模式。因此,我需要实例化一个空的Foo对象,以便模态表单工作 我遇到的问题是,当我远程提交表单时,权威人士抛出了一个错误。错误是: Pundit::NotDefinedError-找不到零的策略 我试图理解为什么会发生这种情况,但我还没能解决它 这是我的foos_controller.rb#索引: 然后,我会有以下“操作前”过滤器,用于我的其他操作,即“创建”Ruby on rails Rails:在Rails中找不到权威策略,ruby-on-rails,ruby-on-rails-5,pundit,Ruby On Rails,Ruby On Rails 5,Pundit,我以前用过这个,但我从来没有试过做我现在想做的事情,出于某种原因,权威人士不高兴 我的目标是在我的“索引”(Foos)页面上创建一个带有“创建”(Foo)表单的模式。因此,我需要实例化一个空的Foo对象,以便模态表单工作 我遇到的问题是,当我远程提交表单时,权威人士抛出了一个错误。错误是: Pundit::NotDefinedError-找不到零的策略 我试图理解为什么会发生这种情况,但我还没能解决它 这是我的foos_controller.rb#索引: 然后,我会有以下“操作前”过滤器,用于我
...
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
....
在我提交表单之前,错误不会自动出现。任何熟悉权威的人都能帮助我理解我做错了什么吗
更新
完整的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
class FoosController
是的,您没有设置@foo
的值,这就是为什么出现错误无法找到零的策略
大多数情况下,您的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
如果有效,请告诉我。是的,您没有设置@foo
的值,这就是为什么出现错误无法找到nil的策略。
大多数情况下,您的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
让我知道这是否有效我在使用Punditgem处理rails6API-only应用程序时遇到了这个问题
当我测试控制器操作的权威授权时,我遇到以下错误:
Pundit::NotDefinedError-找不到零的策略
以下是我解决问题的方法:
假设我有一个叫做学校政策的政策:
class SchoolPolicy < ApplicationPolicy
attr_reader :user, :school
def initialize(user, school)
@user = user
@school = school
end
def index?
user.admin?
end
def show?
user.admin?
end
def new
create?
end
def edit
update?
end
def create
user.admin?
end
def update?
user.admin?
end
def destroy?
user.admin?
end
end
注意:
我使用after\u action
回调调用verify\u authorized
方法来强制控制器操作的授权
我没有在show
操作上调用authorize
方法,因为我根据自己的设计选择跳过该方法进行授权
authorize
方法调用的实例变量对应于被调用的控制器操作的实例变量。因此,对于索引
操作,它是@schools
,对于创建
操作,它是@school
,依此类推
就这些
我希望这对我有所帮助我在使用Punditgem开发只支持API的Rails 6应用程序时遇到了这个问题
当我测试控制器操作的权威授权时,我遇到以下错误:
Pundit::NotDefinedError-找不到零的策略
以下是我解决问题的方法:
假设我有一个叫做学校政策的政策:
class SchoolPolicy < ApplicationPolicy
attr_reader :user, :school
def initialize(user, school)
@user = user
@school = school
end
def index?
user.admin?
end
def show?
user.admin?
end
def new
create?
end
def edit
update?
end
def create
user.admin?
end
def update?
user.admin?
end
def destroy?
user.admin?
end
end
注意:
我使用after\u action
回调调用verify\u authorized
方法来强制控制器操作的授权
我没有在show
操作上调用authorize
方法,因为我根据自己的设计选择跳过该方法进行授权
authorize
方法调用的实例变量对应于被调用的控制器操作的实例变量。因此,对于索引
操作,它是@schools
,对于创建
操作,它是@school
,依此类推
就这些
我希望这有帮助在调用:run\u authorization\u check
方法之前,您可能没有设置@foo
的值,您可以显示您的完整控制器吗?@oreoluwa我更新了我的问题似乎您没有设置@foo
的值,在调用:run\u authorization\u check
方法之前,您能展示一下您的完整控制器吗?@oreoluwa我已经更新了我的问题:如何使用:new或:create方法设置@foo?这通常需要一个空实例……或者我完全遗漏了什么?如何使用:new或:create方法设置@foo?这通常需要一个空实例……或者我完全遗漏了什么?