我正在尝试从 erb 视图中设置带有自定义操作电缆通道的 Turbo 流连接,如下所示:
查看
<%= turbo_stream_from "image_viewer_#{@image.id}", channel: "ImageViewerChannel", data: {image_id: @image.id} %>
<%= turbo_frame_tag "connected_users" do %>
<%= render 'connected_users', count: 0 %>
<% end %>
频道
class ImageViewerChannel < ApplicationCable::Channel
extend Turbo::Streams::Broadcasts, Turbo::Streams::StreamName
include Turbo::Streams::StreamName::ClassMethods
@@connected_users_count = 0
def subscribed
@@connected_users_count += 1
@image_id = params[:image_id]
stream_from "image_viewer_#{@image_id}"
broadcast_connected_users_count
end
.....
private
def broadcast_connected_users_count
ActionCable.server.broadcast(
"image_viewer_#{@image_id}",
Turbo::StreamsChannel.broadcast_replace_to(
"connected_users",
target: "connected_users",
partial: "images/connected_users",
locals: { count: @@connected_users_count }
)
)
end
但我似乎无法让连接正常工作,我已经确认
redis
正在运行,并且通道正在使用激励控制器接受连接,该控制器使用 elevant 流标识符成功建立连接,所以我的假设是它视图中的问题。我还确认了 @image
实例变量已从相关控制器中正确设置,并且它在 HTML 中生成以下输出
<turbo-cable-stream-source channel="ImageViewerChannel" data-image-id="14" signed-stream-name="ImltYWdlX3ZpZXdlcl8xNCI=--0eeda72e7a5478708717f1013f6a650e5b36c5f313a38a50a980e004a841b092"></turbo-cable-stream-source>
如有任何帮助,我们将不胜感激:)
您已经设置了自己的涡轮流频道,只是有点放弃并通过
Turbo::StreamsChannel
发送更新,并且您没有订阅 connected_users
。 broadcast_replace_to
将替换您的涡轮框架,这意味着您在第一次更新后将不会有目标。另外,您不需要涡轮框架。
class ImageViewerChannel < ApplicationCable::Channel
include Turbo::Streams::Broadcasts
include Turbo::Streams::StreamName
@@connected_users_count = 0
def subscribed
@@connected_users_count += 1
@image_id = params[:image_id]
stream_from "image_viewer_#{@image_id}"
broadcast_connected_users_count
end
private
def broadcast_connected_users_count
# NOTE: if you `extend Turbo::Streams::Broadcasts` then you have to
# call it as a class method `ImageViewerChannel.broadcast_update_to`
broadcast_update_to(
"image_viewer_#{@image_id}", # <= this where your're streaming from
# that's where the broadcast goes
target: "connected_users",
partial: "images/connected_users",
locals: {count: @@connected_users_count}
)
end
end
<%= turbo_stream_from "image_viewer_#{@image.id}", channel: "ImageViewerChannel", data: {image_id: @image.id} %>
<%= tag.div id: :connected_users do %>
<%= render "images/connected_users", count: 0 %>
<% end %>