ActionCable 中的“stream_from”和“stream_for”有什么区别?
What is the difference between `stream_from` and `stream_for` in ActionCable?
描述 here 似乎暗示 stream_for
仅在传递记录时使用,但总体而言文档相当模糊。任何人都可以解释 stream_from
和 stream_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 我认为它很好地处理了这个概念
描述 here 似乎暗示 stream_for
仅在传递记录时使用,但总体而言文档相当模糊。任何人都可以解释 stream_from
和 stream_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
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 我认为它很好地处理了这个概念