Ruby on rails Rails 5 ActionCable通过URL参数建立流

Ruby on rails Rails 5 ActionCable通过URL参数建立流,ruby-on-rails,Ruby On Rails,我几乎完全不熟悉Rails,或者我相信我自己会知道如何回答这个问题。我只是想修改在基本ActionCable演示中创建的基本聊天应用程序: 我希望有多个聊天室,而不是只有一个聊天室,因此我修改了我的routes.rb,添加了以下行: get'/rooms/show/:topic',to:'rooms#show' 所以现在我可以根据不同的话题访问不同的聊天室。位于/app/controllers/rooms\u controller.rb的房间控制器可以毫无问题地处理这些路线: class Roo

我几乎完全不熟悉Rails,或者我相信我自己会知道如何回答这个问题。我只是想修改在基本ActionCable演示中创建的基本聊天应用程序:

我希望有多个聊天室,而不是只有一个聊天室,因此我修改了我的
routes.rb
,添加了以下行:

get'/rooms/show/:topic',to:'rooms#show'

所以现在我可以根据不同的话题访问不同的聊天室。位于
/app/controllers/rooms\u controller.rb
的房间控制器可以毫无问题地处理这些路线:

class RoomsController < ApplicationController
  def show
    @topic = params[:topic]
    @messages = Message.all
  end
end

只返回“room\u channel\u”

这里的问题是我无法理解从哪里调用订阅的方法,因此不知道如何向它传递参数

通过阅读actioncable文档:

我发现订阅的方法是通过客户端javascript调用的,而不是由rails控制器调用的。在示例聊天应用程序中,这意味着我必须更改文件
/app/assets/javascripts/channels/room.coffee的第一行

App.room = App.cable.subscriptions.create "RoomChannel",


通过将javascript对象传递给此方法,我可以访问
rooms\u controller.rb的
subscribed
方法中的那些参数在HTML标记中设置
topic\u id
,可能在布局文件的
body
标记中

<body data-topic-id="<%= @topic.id %>">
您的订阅创建行如下所示:

document.querySelector('body').dataset.topicId
App.room = App.cable.subscriptions.create (channel: 'RoomChannel', topic_id: document.querySelector('body').dataset.topicId)

参数在视图和控制器中可用。如果您正在点击控制器中存在的路由,您可以
p params.inspect
如果您不在视图或控制器中,则需要传入值,而不是从params散列中获取值。该死,太近了!我刚刚在github分支上找到了这个片段,我看到您发布了答案。好的研究!只需将rooms\u controller更改为rooms\u Channel,在作业中不也需要更改吗?就像在聊天应用程序示例中,您是如何将参数传递到“ActionCable.server.broadcast'room_channel'”的执行中的?@wbruntra,我面临着一个非常类似的问题,我无法理解您是如何将
主题
对象传递到Action Cable的。请你详细说明一下你是怎么做的好吗?非常感谢。
document.querySelector('body').dataset.topicId
App.room = App.cable.subscriptions.create (channel: 'RoomChannel', topic_id: document.querySelector('body').dataset.topicId)