Gamification de Discourse : Erreur 404 / MissingAttributeError sur la route /leaderboard

Donc, j’ai récemment décidé d’activer la gamification et j’ai immédiatement rencontré un problème où la route /leaderboard renvoyait une erreur 404. Le backend comptait plus de 800 000 enregistrements de scores calculés et les permissions étaient correctes, mais la page elle-même ne se chargeait pas.

L’analyse des journaux du serveur a révélé :
ActiveModel::MissingAttributeError (attribut manquant 'admin' pour User)

En fouillant dans le code du plugin, j’ai remarqué dans lib/discourse_gamification/leaderboard_cached_view.rb que la requête utilisateur utilise une chaîne .select spécifique pour récupérer les colonnes nécessaires au tableau de classement :

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

Comme users.admin et users.moderator ne sont pas inclus dans cette requête, les objets utilisateur instanciés ne disposent pas de ces champs. Il semble (?) qu’à un stade ultérieur, lors de la sérialisation ou du rendu de la mise en page principale, une vérification du statut du personnel soit déclenchée pour ces utilisateurs, ce qui amène Rails à lever l’erreur MissingAttributeError et à basculer vers une erreur 404.

J’ai modifié manuellement ce fichier pour inclure users.admin et users.moderator dans le bloc .select :

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

Après avoir redémarré le conteneur de l’application, le tableau de classement s’est chargé parfaitement.

Je suppose qu’il s’agit d’un bug (?) ou ai-je complètement surestimé ou négligé quelque chose ?

Le site est actuellement sur la version v2026.6.0-latest (47a830330f).

2 « J'aime »

L’erreur et l’explication que vous avez fournies correspondent. Malheureusement, je n’ai pas réussi à reproduire le problème à partir de 47a830330f ni sur main. Je l’ai testé en étant connecté en tant qu’administrateur et en tant qu’utilisateur standard, et les deux chargent correctement.

Pour vérification, je veux simplement confirmer que vous utilisez la version de gamification incluse dans le noyau de Discourse et que le vieux plugin autonome n’est pas installé.

Pouvez-vous fournir plus d’informations sur la pile d’appels indiquant où se produit l’erreur MissingAttributeError ?

1 « J'aime »

@ted,

En fait, vous pouvez tout à fait ignorer cela. J’ai finalement remonté le problème jusqu’à un plugin qui s’intercale dans UserScoreSerializer et qui implémente sa propre requête .select() restrictive. Ce n’était pas évident au départ car aucune trace d’erreur n’était fournie dans /logs pour l’erreur MissingAttributeError. Ce n’est qu’après avoir fouillé et effectué l’appel manuellement via Rails pour obtenir une pile d’appels complète que j’ai pu identifier le plugin fautif.

Merci, et désolé pour la fausse alerte !

2 « J'aime »

Pas de problème ! Vous avez rencontré un souci et vous en avez parlé. Ravi que vous ayez pu résoudre le problème. :slightly_smiling_face: