Los serializadores pueden proporcionarse con un parámetro scope: destinado a proporcionar el contexto de permisos para el serializador. En el código de Discourse, el ámbito proporcionado es un Guardian, y parece que se pretende que cada serializador reciba un Guardian como su ámbito. ApplicationController (la clase base de todos los controladores) mantiene un Guardian y tiene múltiples mecanismos para intentar garantizar que Guardian se inyecte como scope: para todos los serializadores.
Sin embargo, no todos los escenarios están cubiertos por estos mecanismos. Siempre que se construye explícitamente un serializador, por ejemplo, llamadas a ActiveModel::ArraySerializer.new(...), el ámbito debe inyectarse manualmente. De hecho, la mayoría de las instancias de XxxxSerializer.new(...) tienen un scope: scope o scope: guardian en la lista de argumentos. Pero, no todas.
Entonces, mi pregunta: ¿cuál es la filosofía de desarrollo aquí? ¿Es:
- El ámbito simplemente siempre debe reenviarse (a menos que haya una razón específica para no hacerlo); si alguien olvidó hacerlo, es un error a punto de ocurrir y debería corregirse agregando un
scope: ...apropiado; O - Sí, está bien; alguien puede arreglar esos puntos a medida que surjan cuando realmente rompan algo para alguien.
En mi caso, agregué un uso de scope a BasicUserSerializer… y luego me sentí muy perplejo cuando descubrí que rompió cosas en Chat… lo que finalmente me di cuenta (después de cavar demasiado) fue el resultado de que algún serializador enterrado en una cadena XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer no reenviaba el ámbito.