変更を加えた後、トピックリストをどうやって更新できますか?

ソリューション

APIメソッドの最後にこれを追加することで、問題が解決しました。

MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)

これにより、現在のユーザーだけでなく、トピックを閲覧している他のユーザーにもリフレッシュが適用されるはずです。

ここに至るまでの調査

コードベースを追跡したい場合は、読み進めてください。他の誰かの役に立つかもしれないので、共有します。

MessageBusとは?

サムによるMessageBusの説明(2013年)によると、Rubyコードは発行と購読が可能ですが、Javascriptコードは購読しかできないようです。なるほど、この提案されたアーキテクチャでは、私のサーバーサイドコードがUIに通知する責任を負うことになります。

私に役立つMessageBusの例はありますか?

プラグインの例では、MessageBusを使用しているものはありません

GroupArchivedMessage.move_to_inbox!は、私が望んでいるものに近いコードを呼び出しますが、ここで使用されているタイプコードは私には機能しません。

MessageBus.publish("/topic/#{topic_id}", { type: "move_to_inbox" }, group_ids: [group_id])

このコードは有望に見えます。

MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)

これが私が最終的に選択した解決策でした。

ブラウザがアップデートを受け取るとどうなりますか?

Topicsコントローラーは、現在表示しているトピックのアップデートを購読しています。これにより、リフレッシュが開始される"post-stream:refresh"がトリガーされます。反対側でリッスンしているのは、_refreshメソッドをイベントにバインドしているScrollingPostStreamだけです。これが実際にアップデートを実行しているようです。

これにより、他のユーザーにアップデートをプッシュせずに、現在のクライアントだけを更新したい場合は、自分で同じコードを呼び出すことができると推測できます。

this.appEvents.trigger("post-stream:refresh", args)

そして、これはどのコンポーネントからでも呼び出せるようです。

move_postsの元の実装はどうですか? MessageBusに発行しますか?

コアを調査すると、トピックコントローラーのmove_posts()メソッドがmove_posts_to_destination()を呼び出し、それがtopic.move_posts()を呼び出し、new PostMover()を呼び出し、その後to_topic()またはto_new_topic()のいずれかを呼び出します。これらのメソッドはMessageBusを呼び出しませんが、DiscourseEvent.trigger()は呼び出します。

私のカスタムAPIメソッドからtopic.move_posts()を呼び出します。したがって、私のコードはモデルを直接呼び出し、既存のコントローラーロジックはスキップします。

new_topic = topic.move_posts(current_user, [post.id], {title: title, category_id: category_id})

この場合、シーケンスの最終ステップとしてmove_posts_to()が呼び出され、以下のコードが実行されます。

DiscourseEvent.trigger(
  :posts_moved,
  destination_topic_id: destination_topic.id,
  original_topic_id: original_topic.id,
)

しかし、DiscourseEventはMessageBusとは関係ないようです。サーバー内の内部ライフサイクルにのみ使用されているのでしょうか?

したがって、トピックの移動のためにMessageBusが通常発行されることはないと結論付けています。

「いいね!」 4