2014-12-30 2 views
0

Я прочитал несколько вопросов по этой же теме, но никто из них не решает мои сомнения или работает для меня.Pundit не может найти политики, основанные на именах

Pundit не может найти политики с именами в моем коде, но я не могу понять, почему. У меня есть «бэкенд» пространство имен, и в любое время, что items_controller.rb в этом «бэкэндом» называется, она использует приложение/политики/item_policy.rb вместо приложения/политики /backend/item_policit.rb один.

Любая помощь будет очень благодарна пожалуйста. Я много времени занимался этим вопросом.

Мои приложение/политика/ каталог:

application_policy.rb 
backend_policy.rb 
item_policy.rb 
backend/item_policy.rb 

application_policy.rb

class ApplicationPolicy 
    attr_reader :user, :record 

    def initialize(user, record) 
    @user = user 
    @record = record 
    end 

    def index? 
    false 
    end 

    def show? 
    scope.where(:id => record.id).exists? 
    end 

    def create? 
    false 
    end 

    def new? 
    create? 
    end 

    def update? 
    false 
    end 

    def edit? 
    update? 
    end 

    def destroy? 
    false 
    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 
     scope 
    end 
    end 
end 

backend_policy.rb

class Backend::ApplicationPolicy < ApplicationPolicy 
    attr_reader :user, :record 

    def initialize(user, record) 
    @user = user 
    @record = record 
    end 

    def index? 
    false 
    end 

    def show? 
    scope.where(:id => record.id).exists? 
    end 

    def create? 
    false 
    end 

    def new? 
    create? 
    end 

    def update? 
    false 
    end 

    def edit? 
    update? 
    end 

    def destroy? 
    false 
    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 
     scope 
    end 
    end 
end 

бэкенд/item_policy.rb

class Backend::ItemPolicy < Backend::ApplicationPolicy 
    attr_reader :user, :item 

    def initialize(user, item) 
    @user = user 
    @item = item 
    end 

    def index? 
    raise Pundit::NotAuthorizedError, "must be logged in" unless @user.admin? 
    end 
end 

контроллеры/бэкенд/items_controller.rb

class Backend::ItemsController < Backend::ApplicationController 
    before_action :set_item, only: [:show, :edit, :update, :destroy] 
    after_action :verify_authorized 

    # GET /backend/items 
    # GET /backend/items.json 
    def index 
    @search = Item.search (search_params) 
    @items = @search.result().page(params[:page]).per(12) 
    authorize Item 
    end 
.... 
end 

ответ

2

Это как ваше имя политики извлекается в pundit code

def find 
    if object.respond_to?(:policy_class) 
    object.policy_class 
    elsif object.class.respond_to?(:policy_class) 
    object.class.policy_class 
    else 
    klass = if object.respond_to?(:model_name) 
     object.model_name 
    elsif object.class.respond_to?(:model_name) 
     object.class.model_name 
    elsif object.is_a?(Class) 
     object 
    elsif object.is_a?(Symbol) 
     object.to_s.classify 
    else 
     object.class 
    end 
    "#{klass}Policy" 
    end 
end 

Так что либо добавьте functi на «policy_class» к вашей модели или пространству имен сама модель

 Смежные вопросы

  • Нет связанных вопросов^_^