Ruby on rails Rails:在Rails中找不到权威策略

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#索引: 然后,我会有以下“操作前”过滤器,用于我

我以前用过这个,但我从来没有试过做我现在想做的事情,出于某种原因,权威人士不高兴

我的目标是在我的“索引”(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?这通常需要一个空实例……或者我完全遗漏了什么?