Как переопределить рассматриваемый класс политики - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь использовать драгоценный камень Pundit , который позволяет вам переопределить класс политики в контроллере следующим образом

def create
  @publication = find_publication # @publication.class => Post
  authorize @publication, policy_class: PublicationPolicy
  @publication.publish!
  redirect_to @publication
end

Я пытался переопределить класс политики в представлении как ну, как показано ниже, но есть ошибка unknown keyword: :policy_class

<% if policy(@publication, policy_class: PublicationPolicy).create? %>

1 Ответ

1 голос
/ 04 августа 2020

policy - это просто ярлык для поиска политики на основе ресурса, который вы ему передаете.

# Retrieves the policy for the given record.
#
# @see https://github.com/varvet/pundit#policies
# @param user [Object] the user that initiated the action
# @param record [Object] the object we're retrieving the policy for
# @raise [InvalidConstructorError] if the policy constructor called incorrectly
# @return [Object, nil] instance of policy class with query methods
def policy(user, record)
  policy = PolicyFinder.new(record).policy
  policy&.new(user, pundit_model(record))
rescue ArgumentError
  raise InvalidConstructorError, "Invalid #<#{policy}> constructor is called"
end

На самом деле это просто сокращение от MyPolicy.new(user, record). Добавлять к нему опцию policy_class было бы совершенно бессмысленно. Зачем динамически искать что-то, если вы уже знаете, что хотите?

authorize on вызовет NotAuthorizedError, если не разрешено, и динамически вычислит действие, которое вы пытаетесь выполнить, поэтому имеет смысл иметь эту опцию .

...