2016-08-14 2 views
0

Раньше я использовал 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 
+0

Кажется, вы не может быть установлен в значение вашего '@ Foo' , перед вызовом метода ': run_authorisation_check', вы можете показать свой полный контроллер? – oreoluwa

+0

@oreoluwa Я обновил свой вопрос – Herm

ответ

0

Да, вы не устанавливая значение @foo, поэтому вы получаете ошибку unable to find policy of 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 

Позвольте мне знать, если это работает

+0

Как я могу установить @foo с помощью метода new или: create? Обычно это ожидает пустой экземпляр ... Или я вообще что-то упускаю? – Herm