2015-06-22 2 views
1

У меня есть несколько особых ресурсов в моем приложении, например .:Как я могу обеспечить контроль за отдельными ресурсами с помощью Pundit?

# routes.rb 
MySite::Application.routes.draw do 
    resource :thing 
end 

# things_controller.rb 
class ThingsController < ApplicationController 
    def edit 
    load_thing 
    end 

    def update 
    load_thing 
    if @thing.update_attributes(thing_params) 
     ... 
    else 
     ... 
    end 
    end 

    private 

    def load_thing 
    @thing ||= current_user.thing 
    end 

    def thing_params 
    params.require(:thing).permit(...) 
    end 
end 

Я задаюсь вопросом, как обеспечить обзорный политическое использование Pundit (before_action :verify_policy_scoped был установлен в ApplicationController).

Я не уверен, как сформировать свою сферу политики для особых ресурсов, а именно:

# thing_policy.rb 
class ThingPolicy < ApplicationPolicy 
    Scope < Scope 
    def resolve 
     # What to do here... 
     # scope => ? 
    end 
    end 
end 

# things_controller.rb 
def load_thing 
    # ...and what to do here 
    @thing ||= policy_scope(...) 
end 

По словам Pundit's docs:

... метод resolve ... должен возвращать некоторые вид результата, который может быть повторен.

Однако, с особыми ресурсами, этот аргумент итерации не является действительно действительным и не существует области AR-стиля как таковой ... только одна запись.

У кого-нибудь есть предложения по поводу этого?

ответ

0

Сфера действия, как правило, выполняется в действии index, чтобы ограничить базовый набор записей, к которым пользователь может получить доступ до применения фильтрации. Для отдельных записей вы должны указать authorize.

В любом случае, вы уже обзорного @thing к current_user

бы предложить ограничить before_action :verify_policy_scoped к only: [:index]

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

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