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?
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.
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:
@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?
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.
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.