Использование областей Pundit в политике CRUD - PullRequest
0 голосов
/ 22 января 2020

Я использую Pundit (2.1) в приложении на Rails 5, в котором запущено несколько ресурсов Devise (Admin и User). Я хочу использовать настроенную мной область (для записи области, показанной в действии index - которая работает хорошо), чтобы также авторизовать действие show на уровне политики вместо необходимости повторного использования. создать эквивалент в show?. Другими словами, в политике show? я бы подумал, что было бы лучше обратиться к области и посмотреть, присутствует ли запись в результате. Это было предложение в Вариант 3 в ответе на аналогичный вопрос . Похоже, это было стандартом в прошлом, однако в 2016 году этот запрос на получение , похоже, изменил его. Я прочитал краткое обсуждение запроса на извлечение, но я не понимаю, что это за предложенная замена. От нас ожидают, что мы вернем это в каждом конкретном случае, где это необходимо?

Будем весьма признательны за любые разъяснения причин, вызвавших это изменение. Смотрите мой пример реализации ниже:

class PostPolicy < ApplicationPolicy
  def index?
    # Allow indexing for all Devise resources (scoped)
    true
  end

  def show?
    case user.class.name.parameterize.to_sym
    when :admin
      true
    when :user
      # Why is this standard now:
      record.user_id.eql?(user.id)
      # ... instead of this:
      # scope.where(id: record.id).exists?
    end
  end

  # More CRUD actions...

  class Scope < Scope
    def resolve
      case user.class.name.parameterize.to_sym
      when :admin
        scope.all
      when :user
        scope.where(user_id: user.id)
      end
    end
  end
end
class ApplicationPolicy
  # Defaults from generator...

  def show?
    # Removed in pull request linked above
    # scope.where(id: record.id).exists?
    # ... and replaced with
    false
  end

  # Removed in pull request linked above
  # 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.all
    end
  end
end
...