涡轮流和自定义操作有线频道的连接问题

问题描述 投票:0回答:1

我正在尝试从 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>

如有任何帮助,我们将不胜感激:)

ruby-on-rails ruby actioncable hotwire-rails
1个回答
0
投票

您已经设置了自己的涡轮流频道,只是有点放弃并通过

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 %>
© www.soinside.com 2019 - 2024. All rights reserved.