Aquí está lo que he aprendido/deducido:
Guardianes, de hecho, lo que encapsula “¿Qué se le permite hacer al usuario?” (Una instancia deGuardiantiene una instancia deUser, también).- Por lo tanto, el lugar adecuado para un predicado de permisos es simplemente como un método en
Guardian(lib/guardian.rb).- Si el método es “¿Puede el usuario hacer Z a un objeto Xxxx?”, entonces probablemente pertenezca a uno de los archivos de mezcla
XxxxGuardian(lib/guardian/...). - De lo contrario, va a la definición base de
Guardian.
- Si el método es “¿Puede el usuario hacer Z a un objeto Xxxx?”, entonces probablemente pertenezca a uno de los archivos de mezcla
ApplicationControlleradministra un atributoguardianque refleja la solicitud/cliente actual y lo proporciona a los serializadores como suscope, por lo que elGuardianactual está disponible cuando se necesita (excepto cuando no lo está[1]).- Hay lugares donde un
Guardianlisto para usar no está disponible, típicamente en una tarea de backend ejecutada por el sistema, pero si tienes un control sobre un “usuario actuante” (por ejemplo, el usuario destinatario, al generar una notificación por correo electrónico), puedes crear un guardián apropiado sobre la marcha:Guardian.new(the_user).