Я использую 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