【问题标题】:Action Cable: How to deliver missed chat messages行动电缆:如何传递错过的聊天消息
【发布时间】:2016-12-17 22:44:04
【问题描述】:

有什么好的方法可以在聊天中传递错过的消息,例如使用 Action Cable?就像当您关闭笔记本电脑并再次打开它时,您并没有重新加载页面,但您可能错过了消息

一种方法是使用Action Cable 进行AJAX 调用,但随后我将不得不复制您收到消息时发生的一些逻辑。如果可能的话,我想重复使用 Action Cable

【问题讨论】:

  • 包括你的一些动作cable JS。

标签: ruby-on-rails actioncable


【解决方案1】:

当然将它们存储在数据库中。并在您每次重新订阅 Action Cable 时从数据库中加载它们。

【讨论】:

  • 为什么要投反对票?否则你不可能这样做。
【解决方案2】:

我假设您已经看到(read_at timestamp)每条消息的状态,并且您的 web-socket 没有关闭(关闭笔记本电脑或关闭浏览器会关闭它)。

我会创建后台任务来检查所有订阅频道是否有未见消息。 假设您有用户订阅的频道“message_234”,并且那里有一些消息,其中 read_at 在您的表中为零。然后使用您的后台任务将它们广播给您的用户。 将超时设置为 1 天以不使其超载并对您的 message_notification 通道执行相同操作。

【讨论】:

    【解决方案3】:

    您可以使用#transmit#subscribed 中发送过去的消息。

    不幸的是,这种方便的方法几乎没有记录,也没有在当前的edge guide for Action Cable 中提及。但应该在引入 Action Cable 后的所有版本中都可以使用。

    这是一个例子:

    def subscribed
      lobby = Lobby.find(params[:lobby])
      stream_from(stream_name)
      lobby.messages.order(created_at: :asc).each do |message|
        transmit(message.to_json)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 2021-07-16
      相关资源
      最近更新 更多