所以,我最近决定启用游戏化功能,却立刻遇到了一个问题:/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.admin 和 users.moderator,实例化的用户对象中缺少这些字段。看起来(?)在后续的序列化或核心布局渲染过程中,对这些用户触发了工作人员检查,导致 Rails 抛出 MissingAttributeError 并回退到 404 错误。
我手动编辑了该文件,在 .select 块中添加了 users.admin 和 users.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)。