Gamificação do Discourse - Erro 404 / MissingAttributeError na rota /leaderboard

Então, recentemente decidi ativar a gamificação e imediatamente deparei com um problema em que a rota /leaderboard retornava um erro 404. O backend tinha mais de 800 mil registros de pontuação calculados e as permissões estavam corretas, mas a página em si não carregava.

A verificação dos logs do servidor mostrou:
ActiveModel::MissingAttributeError (atributo 'admin' ausente para User)

Ao examinar o código do plugin, notei em lib/discourse_gamification/leaderboard_cached_view.rb que a consulta de usuários usa uma string .select específica para buscar as colunas do ranking:

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

Como users.admin e users.moderator não estão incluídos nessa consulta, os objetos de usuário instanciados não possuem esses campos disponíveis. Parece que (?) mais adiante, durante a serialização ou a renderização do layout principal, uma verificação de equipe é acionada nesses usuários, fazendo com que o Rails lance o MissingAttributeError e retorne um 404.

Editei manualmente esse arquivo para incluir users.admin e users.moderator no bloco .select:

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

Após reiniciar o contêiner do aplicativo, o ranking começou a carregar perfeitamente.

Estou achando que isso seja um bug (?) ou será que eu pensei demais ou deixei passar algo completamente?

O site está atualmente na versão v2026.6.0-latest (47a830330f).

2 curtidas

O erro e a explicação que você forneceu coincidem. Infelizmente, não consegui reproduzir o problema a partir do 47a830330f ou na main. Testei logado como administrador e como usuário comum, e ambos carregam sem problemas.

Como verificação de sanidade, só quero confirmar que você está usando a versão do gamification que vem bundled com o núcleo do Discourse e que não tem o plugin antigo, independente, instalado?

Você consegue fornecer mais do rastreamento de pilha de onde o MissingAttributeError está ocorrendo?

1 curtida

@ted,

Na verdade, fique à vontade para ignorar isso. Acabei rastreando o problema até um plugin que se conectou ao UserScoreSerializer e implementou sua própria instrução .select() restrita. Não ficou claro inicialmente porque não havia um backtrace fornecido em /logs para o MissingAttributeError. Só depois de investigar e fazer a chamada manualmente via Rails para obter um rastreamento de pilha completo consegui identificar o plugin problemático.

Obrigado e desculpe pelo alarme falso!

2 curtidas

Sem problemas! Você teve um problema e postou sobre ele. Fico feliz que tenha resolvido. :slightly_smiling_face: