Änderung des Category-Serializers verhält sich in 2.4.0 anders

Nach dem Upgrade auf Release v2.4.0.beta2 · discourse/discourse · GitHub treten bei fast allen unseren Plugins (z. B. Vorschau von Themenlisten, Events, Standorte, Bewertungen usw.) Probleme mit der Methode add_to_serializer in plugin.rb auf.

Die bisherige Verwendung folgte diesem Format:

add_to_serializer(:serializer, property) { value }

Dies funktioniert in einer Produktionsumgebung nicht mehr. In einer Entwicklungsumgebung funktioniert es jedoch weiterhin.

Anfangs dachte ich, es könnte mit der Art und Weise zusammenhängen, wie das Aktivieren von Plugins gehandhabt wird. Da die Methode _include? von add_to_serializer den Status enabled? verwendet:

if define_include_method
   # Serialisierte Methoden nicht einschließen, wenn das Plugin deaktiviert ist
  klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end

Scheint jedoch die Verwendung des Systems enabled_site_setting das Problem nicht zu beheben. Außerdem scheint enabled? standardmäßig trotzdem auf true gesetzt zu sein:

def enabled?
  @enabled_site_setting ? SiteSetting.get(@enabled_site_setting) : true
end

Um das unmittelbare Problem zu lösen, haben wir die Art und Weise geändert, wie unsere Plugins Daten serialisieren. Ich möchte jedoch, wenn möglich, die Ursache dafür herausfinden. Hat jemand eine Idee, was hier los ist?

cc @merefield, @fzngagan

Das ist höchst ungewöhnlich, da wir dies in Umfragen verwenden und diese sicher nicht defekt sind. Das Einzige, was mir einfällt, ist, dass sie in der Beta-Version defekt waren, aber im Master-Branch behoben wurden? Können Sie es auf ‘tests-passed’ versuchen und prüfen, ob sie funktionieren?

Ich werde es heute weiter testen. Die Verwendung in Umfragen ist etwas anders, da die Methode _include? immer mit einem dritten Parameter false aufgerufen wird. Ich vermute, dass die Methode include? das Problem sein könnte.

add_to_serializer(:post, :polls_votes, false)

Es scheint, dass dieses Problem spezifisch für Änderungen an den Kategorie-Serializern ist.

https://staging.discourse.angusmcleod.com.au hat nur ein Plugin installiert: „test-add-to-serializer"

Wie Sie in der plugin.rb sehen können, wurden mehrere Änderungen an den Serializern vorgenommen.

Die Änderungen an den Nicht-Kategorie-Serializern scheinen zu funktionieren, aber die Änderungen am basic_category-Serializer funktionieren nur im Entwicklungsmodus.

Sie werden die Test-Kategorie-Eigenschaften nicht finden unter:

https://staging.discourse.angusmcleod.com.au/categories.json

oder

https://staging.discourse.angusmcleod.com.au/c/records-musicians.json

Aber Sie werden die anderen Test-Eigenschaften finden unter:

https://staging.discourse.angusmcleod.com.au/t/this-is-a-title-of-a-topic/42.json

oder

https://staging.discourse.angusmcleod.com.au/latest.json

Das Problem scheint also nicht die add_to_serializer-Methode an sich zu sein, sondern die Änderung des basic_category-Serializers.

@j.jaffeux @dan Hey :), es sieht so aus, als hättet ihr kürzlich an discourse-voting gearbeitet, um dasselbe Problem zu lösen, das ich oben geschildert habe.

Wisst ihr, warum es nicht mehr ausreicht, Eigenschaften zum basic_category_serializer hinzuzufügen?

Ich kann bestätigen, dass dies tests-passed betrifft.

Dan ist nicht mehr dabei, aber im Wesentlichen gibt es drei verschiedene Stellen, an denen wir Kategorien mit unterschiedlich viel Daten serialisieren. Wir werden prüfen, ob es möglich ist, das Mixin hier zu entfernen, was die Nachvollziehbarkeit erschwert.

Behoben und auf die Stable- und Beta-Versionen zurückportiert.

Dan hat die Vererbungshierarchie korrekt eingerichtet; es handelte sich lediglich um einen extrem langjährigen Kernfehler.

Danke @sam, sehr geschätzt.

Danke für den Bericht und die Nachhaken dazu. Es war eine sehr, sehr knifflige Sache, die Ursache zu finden. Ich habe einige Zeit damit verbracht, die Rails-Interna zu lesen, um das herauszufinden.

Schau dir unbedingt den neuen Test an, wenn du wissen möchtest, wie wir sicherstellen, dass dies auch in Zukunft einwandfrei funktioniert.

Vielen Dank, @sam, für die schnelle Lösung.

@angus, wird unser Plugin auch ohne die kürzlich vorgenommenen Änderungen, die wir aufgrund dieser Korrektur durchgeführt haben, funktionieren?