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

Другие вопросы по тегам