Discourse 游戏化:在 /leaderboard 路由上出现 404 / MissingAttributeError

所以,我最近决定启用游戏化功能,却立刻遇到了一个问题:/leaderboard 路由返回了 404 错误。后端已计算出超过 80 万条分数记录,权限检查也通过,但页面本身无法加载。

查看服务器日志显示:
ActiveModel::MissingAttributeError (User 缺少属性 'admin')

在深入检查插件代码时,我注意到 lib/discourse_gamification/leaderboard_cached_view.rb 中的用户查询使用了特定的 .select 字符串来提取排行榜所需的列:

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

由于该查询未包含 users.adminusers.moderator,实例化的用户对象中缺少这些字段。看起来(?)在后续的序列化或核心布局渲染过程中,对这些用户触发了工作人员检查,导致 Rails 抛出 MissingAttributeError 并回退到 404 错误。

我手动编辑了该文件,在 .select 块中添加了 users.adminusers.moderator

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

重启应用容器后,排行榜开始正常加载。

我猜测这是一个 bug(?)还是我完全想多了或忽略了什么?

当前网站版本为 v2026.6.0-latest (47a830330f)。

2 个赞

您提供的错误信息与解释相符。遗憾的是,我无法在 47a830330fmain 分支上复现该问题。我尝试以管理员和普通用户身份登录,两者均能正常加载。

为了确认无误,我想核实一下:您使用的是 Discourse 核心内置的 gamification 版本,而不是安装了旧的独立插件,对吗?

您能否提供更多关于 MissingAttributeError 发生位置的堆栈跟踪信息?

1 个赞

@ted,

其实,你可以随意忽略这条消息。我最终将问题追溯到了一个插件上,该插件钩入了 UserScoreSerializer 并实现了自己狭窄的 .select() 语句。起初并不明显,因为 /logs 中没有提供 MissingAttributeError 的堆栈跟踪。只有在深入挖掘并通过 rails 手动调用以获取完整的堆栈跟踪后,我才得以定位到那个有问题的插件。

谢谢,抱歉造成了虚惊!

2 个赞

没问题!你遇到了问题并发帖询问,很高兴问题解决了。:slightly_smiling_face: