Gli serializer possono essere forniti con un parametro scope: destinato a fornire il contesto dei permessi per lo serializer. Nel codice di Discourse, lo scope fornito è un Guardian, e sembra che ogni serializer sia destinato a ricevere un Guardian come suo scope. ApplicationController (la classe base di tutti i controller) mantiene un Guardian e ha molteplici meccanismi per cercare di garantire che Guardian venga iniettato come scope: per tutti gli serializer.
Tuttavia, non tutti gli scenari sono coperti da questi meccanismi. Ogni volta che uno serializer viene costruito esplicitamente, ad esempio chiamate a ActiveModel::ArraySerializer.new(...), lo scope deve essere iniettato manualmente. Infatti, la maggior parte delle istanze di XxxxSerializer.new(...) hanno un scope: scope o scope: guardian nell’elenco degli argomenti. Ma, non tutte.
Quindi, la mia domanda: qual è la filosofia di sviluppo qui? È:
- Lo scope dovrebbe semplicemente essere sempre inoltrato (a meno che non ci sia una ragione specifica per non farlo); se qualcuno ha dimenticato di farlo, è un bug in attesa di accadere e dovrebbe essere corretto aggiungendo un appropriato
scope: ...; OPPURE - Sì, va bene; qualcuno può correggere quei punti man mano che si presentano, quando effettivamente rompono qualcosa per qualcuno.
Nel mio caso, ho aggiunto un utilizzo di scope a BasicUserSerializer… e poi sono rimasto molto perplesso quando ho scoperto che aveva causato problemi in Chat… che alla fine ho capito (dopo troppi scavi) essere il risultato di qualche serializer sepolto in una catena XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer che non inoltrava lo scope!