摘要
在审核队列(/review)中,如果版主编辑了排队帖子的标签然后点击批准,批准请求将失败并返回 500 内部服务器错误。
复现步骤
- 确保有一个帖子在审核队列中等待(例如,来自需要批准的用户/组)。
- 访问
/review。 - 打开排队中的项目。
- 使用标签选择器 UI 编辑标签。
- 点击批准。
- 观察到 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!
