描述
在使用 API 获取活跃用户时,/admin/users/list/active.json 的某些页面返回 HTTP 500 错误。
临时解决方案
如果跳过有问题的页面,其他页面可以正常获取。
错误信息
导致 HTTP 500 的服务器错误:
NoMethodError: undefined method '[]' for nil (NoMethodError)
main_user_record[:silenced_till]
^^^^^^^^^^^^^^^^
from app/models/user.rb:1335:in `silenced_till'
from active_record/attribute_methods/query.rb:48:in `public_send'
from active_record/attribute_methods/query.rb:48:in `query_attribute'
from active_model/attribute_methods.rb:273:in `silenced_till?'
from app/serializers/admin_user_list_serializer.rb:51:in `include_silenced_till?'
from active_model/serializer.rb:375:in `include?'
...
系统日志显示,我们在 2025 年 10 月下旬从 Discourse v3.5.1 升级到 v3.5.2 后开始出现这些错误。相关代码行是在 FIX: Delegate silenced_till from anonymous user to main user account · Pull Request #32416 · discourse/discourse 中引入的,具体讨论见 https://meta.discourse.org/t/silenced-user-can-circumvent-it-entering-anonymous-mode/320052/12。
解决方案
我本人并非 Ruby 专家,但根据我的观察,该问题出现在包含自 v3.5.2 变更以来未活跃用户的 API JSON 页面中。我推测,此次变更可能遗漏了处理某些边界情况的数据库迁移。