Discourse Gamification: 404 / MissingAttributeError auf /leaderboard-Route

Also, ich habe kürzlich beschlossen, Gamification zu aktivieren, und bin sofort auf ein Problem gestoßen, bei dem die Route /leaderboard einen 404-Fehler zurückgegeben hat. Das Backend hatte über 800.000 bewertete Score-Einträge berechnet und die Berechtigungen waren in Ordnung, aber die Seite selbst ließ sich nicht laden.

Die Überprüfung der Server-Logs ergab:
ActiveModel::MissingAttributeError (fehlendes Attribut 'admin' für User)

Beim Durchsuchen des Plugin-Codes fiel mir in lib/discourse_gamification/leaderboard_cached_view.rb auf, dass die Benutzerabfrage einen spezifischen .select-String verwendet, um Spalten für die Rangliste abzurufen:

.select(
"users.id, users.name, users.username, users.uploaded_avatar_id, p.total_score, p.position",
)

Da users.admin und users.moderator nicht in dieser Abfrage enthalten sind, stehen die instanziierten Benutzerobjekte diese Felder nicht zur Verfügung. Es sieht so aus (?), als würde später bei der Serialisierung oder beim Rendern des Kern-Layouts eine Mitarbeiterprüfung für diese Benutzer ausgelöst, was dazu führt, dass Rails den MissingAttributeError wirft und auf einen 404 zurückfällt.

Ich habe diese Datei manuell bearbeitet, um users.admin und users.moderator im .select-Block hinzuzufügen:

.select(
  "users.id, users.name, users.username, users.uploaded_avatar_id, users.admin, users.moderator, p.total_score, p.position",
)

Nach dem Neustart des App-Containers wurde die Rangliste problemlos geladen.

Ich vermute, das ist ein Bug (?), oder habe ich etwas völlig überdacht oder übersehen?

Die Website läuft derzeit auf v2026.6.0-latest (47a830330f).

2 „Gefällt mir“

Der Fehler und die von Ihnen bereitgestellte Erklärung stimmen überein. Leider konnte ich das Problem weder aus 47a830330f noch auf main reproduzieren. Ich habe es sowohl als Administrator als auch als regulärer Benutzer getestet, und in beiden Fällen lädt es einwandfrei.

Als Sanity-Check möchte ich nur bestätigen, dass Sie die Version von gamification verwenden, die im Discourse-Kern enthalten ist, und nicht das alte, eigenständige Plugin installiert haben?

Können Sie weitere Teile des Stack-Traces bereitstellen, wo der MissingAttributeError auftritt?

1 „Gefällt mir“

@ted,

Tatsächlich kannst du das gerne ignorieren. Ich habe das Problem schließlich auf ein Plugin zurückgeführt, das in den UserScoreSerializer eingegriffen hat und eine eigene, enge .select()-Anweisung implementiert hat. Anfangs war dies nicht offensichtlich, da in /logs kein Backtrace für den MissingAttributeError bereitgestellt wurde. Erst nachdem ich tiefer gegraben und den Aufruf manuell über Rails getätigt habe, um einen vollständigen Stack-Trace zu erhalten, konnte ich das fehlerhafte Plugin identifizieren.

Danke und Entschuldigung für den Fehlalarm!

2 „Gefällt mir“

Kein Problem! Du hattest ein Problem und hast es hier gepostet. Schön, dass es jetzt geklärt ist. :slightly_smiling_face: