ActionCable 中的“stream_from”和“stream_for”有什么区别?

What is the difference between `stream_from` and `stream_for` in ActionCable?

描述 here 似乎暗示 stream_for 仅在传递记录时使用,但总体而言文档相当模糊。任何人都可以解释 stream_fromstream_for 之间的区别,为什么要使用一个而不是另一个?

stream_for 只是 stream_from 的简单封装方法。

当您需要与特定模型相关的流时,stream_for 会自动为您生成模型和频道的广播。

假设您有一个 chat_room 实例 ChatRoom class,

stream_from "chat_rooms:#{chat_room.to_gid_param}"

stream_for chat_room # equivalent with stream_from "chat_rooms:Z2lkOi8vVGVzdEFwcC9Qb3N0LzE"

这两行代码做同样的事情。

https://github.com/rails/rails/blob/master/actioncable/lib/action_cable/channel/streams.rb

几乎没问题,但前缀取决于 channel_name,而不是模型 class。

class CommentsChannel < ApplicationCable::Channel
  def subscribed
    stream_for article
    # is equivalent to
    stream_from "#{self.channel_name}:{article.to_gid_param}"
    # in this class this means
    stream_from "comments:{article.to_gid_param}"
  end

  private

  # any activerecord instance has 'to_gid_param'
  def article
    Article.find_by(id: params[:article_id])
  end
end

您还可以将简单的字符串传递给 stream_for,它只是添加频道名称。

stream_for 接受一个对象作为参数

class UserChannel < ApplicationCable::Channel
  def subscribed
    stream_for current_user
  end
end

stream_from 接受一个字符串作为参数

class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "chat_channel_#{params[:id]}"
  end
end

检查这个 article 我认为它很好地处理了这个概念