【问题标题】:Broadcast to a User's Turbo Stream using Hotwire Rails使用 Hotwire Rails 广播到用户的 Turbo 流
【发布时间】:2021-01-15 12:53:50
【问题描述】:

我想在 Rails 中使用 Hotwire 流式传输模型更新。在文档中,他们提到使用模型创建流,但我想为每个用户创建一个动态流,以便用户对模型所做的更改仅流向该用户。

我有一个 VideoCall 模型,它通过一个连接表拥有并属于许多用户,所以模型看起来像这样,我有这样的广播

class VideoCall < ApplicationRecord
  has_and_belongs_to_many :users

  broadcasts_to ->(video_call) {
    video_call.users.map{|u| "video_calls:user_#{u.id}"}
  }, inserts_by: :prepend

  # more code here
end

在我想要获取已添加模型更新的 ERB 模板上

<%= turbo_stream_from "video_calls:user_#{current_user.id}" %>

如果我在 users_video_calls 表中有一个用户,则此方法有效。但是,一旦 video_call 中有多个用户,它就不起作用,我想向所有这些用户的流进行广播。

我采用的方法是否正确,如何实现向多个用户流的动态广播。

【问题讨论】:

    标签: ruby-on-rails actioncable hotwire-rails


    【解决方案1】:

    所以我通过以下方式解决了这个问题。查看源代码,我意识到重写在创建、更新和销毁时调用的三个回调是有意义的。所以我删除了这段代码

      broadcasts_to ->(video_call) {
        video_call.users.map{|u| "video_calls:user_#{u.id}"}
      }, inserts_by: :prepend
    

    并用这个替换它

      after_create_commit  -> {
        self.users.each do |u|
          broadcast_action_later_to "video_calls:users_#{u.id}", action: :prepend, target: broadcast_target_default
        end
      }
    
      after_update_commit  -> {
        self.users.each do |u|
          broadcast_replace_later_to "video_calls:users_#{u.id}"
        end
      }
    
      after_destroy_commit -> {
        self.users.each do |u|
          broadcast_remove_to "video_calls:users_#{u.id}", action: :prepend, target: broadcast_target_default
        end
      }
    
    

    现在在上面的代码中,我可以遍历每个关联模型,在我的例子中,每个视频通话有很多用户,并广播到包含用户 ID 的频道名称。所以订阅视频通话的所有用户都只会收到更新,而不是所有人。

    【讨论】:

    • 看起来不错。但我认为您的broadcast_remove_to 声明中不需要action: :prepend
    • 我一直想做同样的事情——使用 Hotwire 来管理范围为已登录用户的消息列表。感谢您跟进您的解决方案。
    • 谢谢,很好的解决方案。但是,如果您想更新同一用户的视图(假设该网站在 2 个不同的浏览器中打开),则 after_destroy_commit 不起作用。原因是 self.users 不包含刚刚删除任何 self 的用户(在我的情况下是链接)。我不知道该怎么做。有什么想法吗?
    猜你喜欢
    • 2021-06-17
    • 2021-07-24
    • 1970-01-01
    • 2022-01-16
    • 2021-09-13
    • 2022-12-29
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多