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