Come posso aggiornare l'elenco degli argomenti dopo aver apportato una modifica?

Soluzione

Mettere questo alla fine del mio metodo API ha risolto il problema:

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

Questo dovrebbe aggiornare non solo per l’utente corrente, ma anche per chiunque altro stia visualizzando l’argomento.

Esplorazione che mi ha portato qui

Continua a leggere se vuoi seguire il mio percorso attraverso la codebase. Condivido questo per chiunque altro possa trovarlo utile.

Cos’è MessageBus?

Dalla spiegazione di Sam del 2013 su MessageBus sembra che il codice Ruby possa pubblicare e sottoscrivere, mentre il codice Javascript può solo sottoscrivere. Ok, quindi sotto questa architettura proposta il mio codice lato server sarà responsabile di notificare l’interfaccia utente.

Esiste un esempio di MessageBus che mi è utile?

Nessuno degli esempi di plugin fa nulla con MessageBus.

GroupArchivedMessage.move_to_inbox! chiama questo codice che è piuttosto vicino a quello che voglio, ma il tipo di codice utilizzato qui non funzionerà per me.

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

Questo codice sembra promettente.

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

Questa è stata la soluzione finale che ho scelto.

Cosa succede quando il browser riceve l’aggiornamento?

Il controller degli argomenti è sottoscritto agli aggiornamenti sull’argomento che sta visualizzando. Attiva "post-stream:refresh", che avvia l’aggiornamento. L’unica cosa che riesco a trovare in ascolto dall’altra parte è ScrollingPostStream che collega un metodo _refresh all’evento. Questo sembra essere ciò che sta effettivamente eseguendo l’aggiornamento.

Da questo deduco che se volessi aggiornare solo il client attuale senza inviare l’aggiornamento a nessun altro, potrei chiamare lo stesso codice da solo:

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

E sembra che potrei chiamarlo da qualsiasi componente.

E l’implementazione originale di move_posts? Pubblica su MessageBus?

Indagando sul core vedo: il metodo move_posts() del controller degli argomenti chiama move_posts_to_destination() che chiama topic.move_posts() che chiama new PostMover() e poi to_topic() o to_new_topic(). Questi metodi non chiamano MessageBus, ma chiamano DiscourseEvent.trigger().

Chiamo topic.move_posts() dal mio metodo API personalizzato. Quindi il mio codice chiama direttamente il modello, saltando tutta la logica esistente del controller:

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

Nel mio caso viene chiamato move_posts_to() come ultimo passaggio della sequenza, che chiama quanto segue:

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

DiscourseEvent non sembra avere nulla a che fare con MessageBus, tuttavia. Forse è utilizzato solo per i cicli di vita interni al server?

Quindi concludo che MessageBus non viene normalmente pubblicato per uno spostamento di argomento.

4 Mi Piace