:approved_post イベントでカスタムフィールドが取得できない

レビューが必要な投稿のカスタムフィールドを保存しようとしています。投稿を承認すると、カスタムフィールドが保存されません。

:approved_post イベントを確認しましたが、ペイロードにカスタムフィールドが設定されていません。

レビュー可能な投稿でカスタムフィールドを保持する方法は?

また、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 インスタンス(理想的にはペイロードにカスタムフィールドを含むはずのもの)にはデータがありません。

私は以下を試しました。

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # この条件は true になります
      manager.args['is_event'] = true
end

その後、

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # ここではデータが利用できません
 end

これは興味深いですね。ここでも投票が機能しないとは思いませんでした。manager に渡された引数は、自動的に reviewable のペイロードに格納されるわけではありません。

投票と保留中の投稿に関するバグではないかと疑っています。承認後に validate_polls が呼び出されていない可能性があります。@Roman さん、これを調べていただけますか?

これはバグであることを確認しました。is_poll がペイロード内に保存されていないため、コールバックが機能しません。

これを修正する PR はこちらです:

また、プラグインから許可された属性のリストを拡張できるように、新しいインターフェースも追加しました。

@Roman@eviltrout、本当にありがとうございます。この件を解決するのに丸2日かかりました。

お疲れ様でした、@fzngagan さん!

@Roman、この機能はバックポートする必要があると思いますか?
テストが通過したブランチやリリースブランチにいる人々も恩恵を受けられるようにすべきだと考えます。post_custom_fields を使用するプラグインの多く、あるいはほとんどが、このエッジケースを処理する必要があると思います。

@fzngagan これはすでに tests-passed にあるようです。Commits · discourse/discourse · GitHub をご覧ください。

@merefield ああ、気づきませんでした。