编辑/review中的标签后批准可审阅帖子时出现500错误(标签保存为对象而非字符串)

摘要

在审核队列(/review)中,如果版主编辑了排队帖子的标签然后点击批准,批准请求将失败并返回 500 内部服务器错误


复现步骤

  1. 确保有一个帖子在审核队列中等待(例如,来自需要批准的用户/组)。
  2. 访问 /review
  3. 打开排队中的项目。
  4. 使用标签选择器 UI 编辑标签。
  5. 点击批准
  6. 观察到 500 响应。

预期行为

帖子应成功批准,并应用更新后的标签。


实际行为

批准失败并出现 500 错误。

示例请求模式:

PUT /review/{id}/perform/approve_post?version={x} → 500 (Internal Server Error)

发生原因(根本原因)

在审核 UI 中编辑标签后,reviewable 有效载荷存储的是完整的标签对象而不是标签名称字符串

编辑标签前:

payload["tags"] = ["tag-one", "tag-two"]

/review 中编辑标签后:

payload["tags"] = [
  {"id"=>123, "name"=>"tag-one", "description"=>nil, "count"=>50, ...},
  {"id"=>456, "name"=>"tag-two", "description"=>nil, "count"=>30, ...}
]

当批准操作处理标签时,它似乎期望接收字符串,但接收到了哈希/对象,从而导致 500 错误。


解决方法

将标签规范化回名称:

r = ReviewableQueuedPost.find(ID)
r.payload["tags"] = r.payload["tags"].map { |t| t.is_a?(Hash) ? t["name"] : t }
r.save!

1 个赞

感谢您的报告。我们会查看一下。

3 个赞

这将在 FIX: Cater for reviewable tag payloads that have been saved as names by nattsw · Pull Request #37477 · discourse/discourse · GitHub 中修复。非常感谢快速的错误报告。

4 个赞

此主题在 2 天后自动关闭。不再允许回复。