Rails Pundit, как работают политики?
У меня есть веб-приложение в ruby на рельсах с devise в качестве аутентификации и pundit в качестве авторизации.
У меня есть модель user
с целым числом role
атрибут со значениями 0, 1, 2, для visitor
, vip
, а также admin
соответственно. У меня тоже есть эшафот, скажем Page
что я хочу просто vip
а также admin
иметь доступ и не visitor
пользователи.
В page_policy.rb у меня есть
def index?
current_user.vip? or current_user.admin?
end
а в pages_controller.rb у меня есть строка authorize current_user
, Хотя я дал доступ к vip
но это доступно только для admin
пользователь. Где я был не прав с кодом?
Спасибо
1 ответ
Я предполагаю, что вы правильно настроили свои методы предикатов vip?
а также admin?
на User
модель, а эти работают как положено? Можете ли вы проверить результат вызова каждого из этих методов у вашего текущего пользователя?
Пандит фактически передает результат current_user
к инициализатору политики, и вы можете получить к нему доступ через user
метод внутри ваших методов политики. Также я буду осторожен в использовании or
оператор в этом контексте (см. http://www.virtuouscode.com/2010/08/02/using-and-and-or-in-ruby/).
Поэтому я бы попробовал:
def index?
user.vip? || user.admin?
end
Кроме того, pundit ожидает, что вы передадите проверяемый ресурс authorize
метод, а не объект пользователя. Если у вас нет экземпляра для передачи, вы можете передать класс:
authorize Page