Где лучше предложить предикат разрешений?

Вот что я понял/вывел:

  • Guardian действительно отвечает за инкапсуляцию вопроса «Что пользователю разрешено делать?» (экземпляр Guardian также содержит экземпляр User).
  • Следовательно, правильное место для предиката прав доступа — это просто метод в классе Guardian (lib/guardian.rb).
    • Если метод отвечает на вопрос «Может ли пользователь сделать Z с объектом типа Xxxx?», то он, скорее всего, должен находиться в одном из файлов миксинов XxxxGuardian (lib/guardian/...).
    • В противном случае он добавляется в базовое определение Guardian.
  • ApplicationController управляет атрибутом guardian, отражающим текущий запрос/клиент, и передаёт его сериализаторам в качестве их scope, так что текущий Guardian доступен при необходимости (за исключением случаев, когда это невозможно[1]).
  • Существуют места, где готовый экземпляр Guardian недоступен, обычно это фоновые задачи, выполняемые системой. Однако если у вас есть доступ к «действующему пользователю» (например, пользователю-получателю при генерации уведомления по электронной почте), вы можете создать соответствующий Guardian на лету: Guardian.new(the_user).

  1. ↩︎