我尝试为需要审核的帖子保存自定义字段。当我批准帖子时,自定义字段并未被保存。
我检查了 :approved_post 事件,发现自定义字段并未包含在负载(payload)中。
如何为可审核帖子保留自定义字段?
另外,我使用了 NewPostManager,在处理器中自定义字段是可用的,但当然,它会在将数据保存到审核队列之前被触发。
我尝试为需要审核的帖子保存自定义字段。当我批准帖子时,自定义字段并未被保存。
我检查了 :approved_post 事件,发现自定义字段并未包含在负载(payload)中。
如何为可审核帖子保留自定义字段?
另外,我使用了 NewPostManager,在处理器中自定义字段是可用的,但当然,它会在将数据保存到审核队列之前被触发。
您能给我们展示一些代码吗?最好是能够复现此问题所需的最少代码。
我正在修复事件插件的一个问题:当分类设置为需要审核主题时,post_custom_field 中的事件数据无法保存。
我参考了 polls 插件,发现那里的自定义字段是在 :approved_post 上设置的。
这是 polls 插件的代码片段:
NewPostManager.add_handler(1) do |manager|
post = Post.new(raw: manager.args[:raw])
if !DiscoursePoll::PollsValidator.new(post).validate_polls
result = NewPostResult.new(:poll, false)
post.errors.full_messages.each do |message|
result.errors[:base] << message
end
result
else
manager.args["is_poll"] = true
nil
end
end
on(:approved_post) do |queued_post, created_post|
if queued_post.payload["is_poll"]
created_post.validate_polls(true)
end
end
在我的尝试中,自定义字段的数据在 NewPostManager 中是可用的,但在 :approved_post 回调中的 ReviewableQueuedPost 实例(理论上其 payload 中应包含自定义字段)却找不到这些数据。
我尝试了以下代码:
NewPostManager.add_handler do |manager|
if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # 此条件为真
manager.args['is_event'] = true
end
然后是:
on(:approved_post) do |reviewable, post|
p reviewable.payload['is_event'] # 此处数据不可用
end
这很有趣,因为我也没想到这里的投票功能会生效。传递给 manager 的参数不会自动放入 reviewable 的 payload 中。
我怀疑投票和待审核帖子之间存在一个 bug。我怀疑在审批后从未调用过 validate_polls。@Roman,你能帮忙检查一下吗?
我确认这是一个 bug。is_poll 未被存储在 payload 中,导致回调无效。
以下是修复此问题的 PR:
我还添加了一个新接口,以便我们可以从插件扩展允许的属性列表。
非常感谢你们,@Roman 和 @eviltrout。我花了整整两天时间才弄清楚这个问题。
做得好 @fzngagan!
@Roman,你认为这个功能需要向后移植吗?
我认为应该这样做,以便测试通过分支和发布分支上的用户也能受益。我认为,使用 post_custom_fields 的一些(如果不是大多数)插件都需要处理这个边缘情况。
@fzngagan 看起来这已经在 tests-passed 上了,见 Commits · discourse/discourse · GitHub
@merefield 哦,我没注意到。