Rails Action Cable:如何访问 ApplicationCable::Channel Class 中的实例变量?

Rails Action Cable: How can I access instance variables within ApplicationCable::Channel Class?

我想为每个产品页面创建聊天室,以便用户可以在与其他产品的讨论隔离的同时谈论该产品。

为了这个目的;我计划在定义订阅时使用@product instance varialbe,但看起来如此;在 Action Cable

中无法访问实例变量

"app/channels/product_channel.rb"

class ProductChannel < ApplicationCable::Channel
  def subscribed
    stream_from "room_channel_product_#{@product.id}"
  end

  def unsubscribed
  end
end

如何访问通道模块中的实例变量?

我认为您不能在定义订阅时访问实例变量。但是你可以传递 product_id 作为参数,然后你订阅 ProductChannel。 https://guides.rubyonrails.org/action_cable_overview.html#subscriber

App.cable.subscriptions.create { channel: "ProductChannel", product_id: your_product_id }

在您的频道上,您可以访问 "product_id",例如:

def subscribed
  stream_from "product_channel_#{params[:product_id]}"
end

在您的 subscribed 方法中声明变量。将 subscribed 方法视为频道上下文中的初始化程序。

一个例子exists within the ActionCable codebase本身。在你的情况下,这可以像这样实现

class ProductChannel < ApplicationCable::Channel
  def subscribed
    @product = Product.find(params[:product_id])
    stream_from "room_channel_product_#{@product.id}"
  end

  def unsubscribed
  end

  def foo
    @product.do_stuff
  end
end