Discourse Bug 报告::post_edited 事件在 latest-release 版本中回归
影响范围: Discourse latest-release 分支 (release +122)
状态: 已确认回归 - 可重现
日期: 2026年1月15日
摘要
在最近的 latest-release 构建中,:post_edited DiscourseEvent 不再发布。帖子编辑成功完成,修订版本也已创建,但插件所依赖的事件从未触发。这破坏了所有使用 post_created_edited 自动化触发器以及监听 :post_edited 事件的其他插件。
复现步骤(已确认)
我们通过在两个相同的 Azure AKS 环境上进行测试,确认了这是一个回归问题:
更新前(工作正常)
- 版本:
v2026.1.0-latest(较旧的构建) - 行为:
:post_edited事件正确触发 - 自动化:
自动工作
更新后(已损坏)
- 版本:
latest-release +122 hours ago, release +122 - 行为:
:post_edited事件从未触发 - 自动化:
完全损坏
关键发现: 在更新之前,两个环境都能正常工作。更新到 latest-release +122 后都出现了问题。这明确证明了引入了回归。
环境详情
- Discourse 版本:
latest-release(release +122) - Rails 版本: 8.0.4
- 基础设施: Azure Kubernetes Service (AKS)
- Docker 镜像: discourse/base:2.0.20260109-0020
- 部署: 标准 Discourse Docker 安装
测试过程
测试 1:事件监听器(证明事件从未触发)
# 在 Rails 控制台中
File.open('/tmp/post_edited_test.log', 'w') { |f| f.write("Test started at #{Time.now}\n") }
DiscourseEvent.on(:post_edited) do |post, topic_changed, revisor|
File.open('/tmp/post_edited_test.log', 'a') do |f|
f.write("[#{Time.now}] :post_edited fired! Post #{post.id}\n")
end
end
然后在通过 Web 界面编辑任何帖子并检查:
cat /tmp/post_edited_test.log
在 latest-release +122 上的结果: 只显示“Test started” - 事件从未触发
在旧版本上的结果: 显示带有时间戳和帖子 ID 的事件条目
测试 2:验证修订版本的创建
post = Post.find(POST_ID)
puts "Post revisions: #{post.revisions.count}"
post.revisions.last(3).each { |rev| puts " Revision #{rev.number}: #{rev.created_at}" }
结果: 修订版本已正确创建并带有正确的时间戳
结论: 编辑已成功处理,但 post_process_post 未被调用或事件未被触发
测试 3:手动触发事件(证明事件系统工作正常)
post = Post.find(POST_ID)
DiscourseEvent.trigger(:post_edited, post, false, PostRevisor.new(post))
结果: 事件处理程序正确执行
结论: 事件系统工作正常,但编辑期间的自动触发已损坏
预期行为
当通过 Web 界面编辑帖子时:
- 编辑成功保存

- 创建帖子修订版本

- 调用
PostRevisor#post_process_post
- 触发
:post_edited事件
- 事件处理程序执行

只有步骤 1-2 有效。步骤 3-5 已损坏。
实际行为
生产日志显示编辑完成成功:
Started PUT "/posts/3631" for 88.97.179.124 at 2026-01-15 13:06:19 +0000
Processing by PostsController#update as JSON
Completed 200 OK in 676ms
没有错误,没有异常,但没有发布 :post_edited 事件。
该事件应在 /var/www/discourse/lib/post_revisor.rb 的第 759 行触发:
def post_process_post
@post.invalidate_oneboxes = true
@post.trigger_post_process
DiscourseEvent.trigger(:post_edited, @post, self.topic_changed?, self)
end
此方法从第 341 行调用,但事件未被触发。
影响
受影响的官方功能
- Discourse 自动化:
post_created_edited触发器完全损坏 - 依赖帖子编辑的任何自动化工作流都会静默失败
受影响的插件
所有监听 :post_edited 事件的插件都已损坏:
- discourse-automation - 官方自动化触发器
- discourse-ai - 对编辑后的帖子进行 AI 审核
- discourse-doc-categories - 文档索引更新
- discourse-topic-voting - 投票收回工作流
- 任何使用帖子编辑事件的自定义插件
回归时间线
- 旧版本:
v2026.1.0-latest-:post_edited事件工作正常
- 更新到:
latest-release(release +122) -:post_edited事件损坏
- 在以下环境中确认: 两个独立的生产环境(更新后都出现问题)
这明确证明了在最近的 latest-release 构建中引入了回归。
解决方法
通过 Rails 控制台手动触发可以工作:
automation = DiscourseAutomation::Automation.find(AUTOMATION_ID)
post = Post.find(POST_ID)
automation.trigger!({"post" => post})
这证实了自动化系统本身是正常的——只是自动事件触发已损坏。
配置说明
- 已验证设置: 所有与编辑相关的设置都是标准/默认设置
- 宽限期: 在宽限期之外进行了测试(无影响)
- 插件: 安装了 50 个插件(标准的官方插件)
- 无核心修改: 干净的 Discourse 安装
- 环境: 两个测试环境都是相同的 Azure AKS 部署
关键证据
最重要发现:
我们有一个基于旧版本的正常运行的 DEV 环境。在更新到
latest-release +122之后,自动化停止工作。这可以肯定地证明在最近的版本中引入了回归。
两个环境在处于同一版本后,现在表现出相同的损坏行为。
可复现性
100% 可复现 - 在两个独立的环境上进行了测试:
- 安装 Discourse
latest-release(release +122) - 创建带有
post_created_edited触发器的自动化 - 编辑帖子
- 观察自动化从未触发
- 使用测试监听器确认
:post_edited事件从未触发
摘要
这是 latest-release (release +122) 中的一个已确认的回归。:post_edited 事件在以前的版本中工作正常,但在更新后停止工作。两个独立的环境都确认了相同的行为。这破坏了核心 Discourse 自动化功能以及所有依赖帖子编辑事件的插件。

