حل
وضع هذا في نهاية طريقة API الخاصة بي حل المشكلة:
MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)
هذا يجب أن يقوم بالتحديث ليس فقط للمستخدم الحالي، ولكن لأي شخص آخر يشاهد الموضوع.
استكشاف أدى بي إلى هنا
تابع القراءة إذا كنت ترغب في تتبع معي عبر قاعدة الأكواد. أشارك هذا لأي شخص قد يكون مفيدًا له.
ما هو MessageBus؟
من شرح سام لـ MessageBus عام 2013 يبدو أن كود Ruby يمكنه النشر والاشتراك، بينما كود Javascript يمكنه فقط الاشتراك. حسنًا، تحت هذه البنية المقترحة، سيكون كود جانب الخادم الخاص بي مسؤولاً عن إخطار واجهة المستخدم.
هل هناك مثال لـ 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 controller) مشترك في التحديثات على الموضوع الذي يعرضه حاليًا. يقوم بتشغيل "post-stream:refresh"، مما يبدأ التحديث. الشيء الوحيد الذي يمكنني العثور عليه يستمع على الطرف الآخر هو ScrollingPostStream الذي يربط طريقة _refresh بالحدث. يبدو أن هذا هو ما يقوم فعليًا بالتحديث.
بناءً على هذا، أستنتج أنه إذا كنت أرغب في تحديث العميل الحالي فقط دون دفع التحديث إلى أي شخص آخر، يمكنني استدعاء نفس الكود بنفسي:
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().
أنا أستدعي topic.move_posts() من طريقة API المخصصة الخاصة بي. لذا فإن الكود الخاص بي يستدعي مباشرة النموذج، ويتجاوز أي منطق وحدة تحكم موجود:
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 لا يتم نشره عادةً لنقل موضوع.