Gamification di Discourse: Errore 404 / MissingAttributeError sulla rotta /leaderboard

Quindi, ho recentemente deciso di abilitare la gamification e mi sono subito imbattuto in un problema: la rotta /leaderboard restituiva un errore 404. Il backend aveva oltre 800.000 record di punteggi calcolati e i permessi erano corretti, ma la pagina stessa non si caricava.

La verifica dei log del server ha mostrato:
ActiveModel::MissingAttributeError (attributo mancante 'admin' per User)

Mentre esaminavo il codice del plugin, ho notato in lib/discourse_gamification/leaderboard_cached_view.rb che la query sull’utente utilizza una stringa .select specifica per estrarre le colonne per la classifica:

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

Poiché users.admin e users.moderator non sono inclusi in quella query, gli oggetti utente istanziati non dispongono di quei campi. Sembra che (?) più avanti nel processo, durante la serializzazione o il rendering del layout principale, venga attivato un controllo per lo staff su quegli utenti, facendo sì che Rails generi l’errore MissingAttributeError e ricada su un 404.

Ho modificato manualmente quel file per includere users.admin e users.moderator nel blocco .select:

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

Dopo aver riavviato il contenitore dell’applicazione, la classifica ha iniziato a caricarsi perfettamente.

Immagino che si tratti di un bug (?) o ho esagerato/trascurato qualcosa del tutto?

2 Mi Piace

L’errore e la spiegazione che hai fornito coincidono. Purtroppo non sono riuscito a riprodurre il problema partendo da 47a830330f o su main. Ho provato accedendo come amministratore e come utente normale, e in entrambi i casi si caricano correttamente.

Come controllo di coerenza, vorrei solo confermare che stai utilizzando la versione di gamification inclusa nel nucleo di Discourse e che non è installato il vecchio plugin autonomo.

Riuscite a fornire più dettagli dello stack trace su dove si verifica l’errore MissingAttributeError?

1 Mi Piace

@ted,

In realtà, sentiti libero di ignorare questo messaggio. Alla fine ho rintracciato il problema fino a un plugin che si agganciava a UserScoreSerializer e implementava la propria istruzione .select() ristretta. All’inizio non era evidente perché nei /logs non veniva fornito alcun backtrace per MissingAttributeError. Solo dopo aver scavato a fondo e chiamato manualmente tramite Rails per ottenere un stack trace completo sono riuscito a individuare il plugin problematico.

Grazie e scusa per il falso allarme!

2 Mi Piace

Nessun problema! Hai avuto un problema e ne hai parlato. Sono contento che tu l’abbia risolto. :slightly_smiling_face: