Serialisierern kann ein scope:-Parameter mitgegeben werden, der dazu dient, den Berechtigungskontext für den Serialisierer bereitzustellen. Im Discourse-Code ist der bereitgestellte Scope ein Guardian, und es scheint, dass jeder Serialisierer einen Guardian als seinen Scope erhalten soll. ApplicationController (die Basisklasse aller Controller) unterhält einen Guardian und verfügt über mehrere Mechanismen, um sicherzustellen, dass Guardian als scope: für alle Serialisierer injiziert wird.
Allerdings sind nicht alle Szenarien von diesen Mechanismen abgedeckt. Immer wenn ein Serialisierer explizit konstruiert wird, z. B. bei Aufrufen von ActiveModel::ArraySerializer.new(...), muss der Scope manuell injiziert werden. Tatsächlich haben die meisten Instanzen von XxxxSerializer.new(...) ein scope: scope oder scope: guardian in der Argumentenliste. Aber nicht alle.
Meine Frage lautet also: Was ist die Entwicklungsphilosophie hier? Ist es:
- Der Scope sollte einfach immer weitergeleitet werden (es sei denn, es gibt einen bestimmten Grund, dies nicht zu tun); wenn jemand vergessen hat, dies zu tun, ist das ein potenzieller Fehler, der behoben werden sollte, indem ein entsprechendes
scope: ...hinzugefügt wird; ODER - Ja, das ist in Ordnung; jemand kann diese Stellen beheben, wenn sie tatsächlich etwas für jemanden kaputt machen.
In meinem Fall habe ich eine Verwendung von scope zu BasicUserSerializer hinzugefügt… und war dann sehr verwirrt, als ich feststellte, dass dies Dinge im Chat kaputt machte… was ich schließlich (nach viel zu viel Graben) erkannte, war das Ergebnis, dass ein Serialisierer, der in einer Kette versteckt war XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer, den Scope nicht weitergeleitet hat!