Классы авторизации Pundit - это старые классы ruby. Используя метод pundit authorize
, вы можете передать объект для авторизации и дополнительный запрос. Когда вы, например, используете метод авторизации как
authorize @product, :update?
метод authorize вызовет метод update?
класса ProductPolicy
. Если запрос не передан, имя действия контроллера +? метка будет установлена как запрос. Взгляните на Определение метода авторизации Pundit .
Таким образом, для передачи дополнительных параметров в метод авторизации Pundit необходимо переопределить метод авторизации с помощью дополнительного аргумента:
module Pundit
def authorize(record, query=nil, options=nil)
query ||= params[:action].to_s + "?"
@_pundit_policy_authorized = true
policy = policy(record)
if options.nil?
raise NotAuthorizedError, query: query, record: record, policy: policy unless policy.public_send(query)
else
raise NotAuthorizedError, query: query, record: record, policy: policy unless policy.public_send(query, options)
end
end
end
Тогда в вашем классе политики вы можете использовать этот дополнительный параметр
class ProductPolicy
...
def update?(options)
...
end
def new?
...
end
...
end
Как видите, у вас могут быть методы политики, которые принимают аргумент дополнительных опций.
Затем вы можете использовать метод authorize в ваших контроллерах одним из следующих способов:
authorize @product
authorize @product, nil, { owner: User.find(1) }
authorize @product, :some_method?, { owner: User.find(1) }
authorize @product, :some_method?