在 :approved_post 事件中无法获取自定义字段

我尝试为需要审核的帖子保存自定义字段。当我批准帖子时,自定义字段并未被保存。

我检查了 :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 哦,我没注意到。