Rails 5 ActionCable从URL参数建立流

我对Rails几乎是全新的,或者我相信我会知道如何自己回答这个问题。 我只是想修改基本的ActionCable演示中创建的基本聊天应用程序: https ://medium.com/@dhh/rails-5-action-cable-demo-8bba4ccfc55e#.6lmd6tfi7

我想拥有多个聊天室,而不是只有一个聊天室,所以我通过添加以下行来修改我的routes.rb

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

所以现在我可以根据不同的主题访问不同的聊天室。 /app/controllers/rooms_controller.rb的房间控制器处理这些路线没有问题:

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

但是这个参数没有传递给app/channels/room_channel.rb ,我只是不确定我需要做什么修改。 我目前的尝试:

 class RoomChannel < ApplicationCable::Channel def subscribed stream_from "room_channel_#{params[:topic]}" end 

只返回“room_channel_”

这里的问题是我无法理解调用订阅方法的位置,因此不知道如何将参数传递给它。

通过阅读actioncable文档: https : //github.com/rails/rails/tree/master/actioncable

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

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

 App.room = App.cable.subscriptions.create { channel: "RoomChannel", topic: topic}, 

将javascript对象传递给此方法允许我在rooms_controller.rbsubscribed方法中访问这些参数。

在HTML标记中设置topic_id ,可能在布局文件的body标记中。

  

现在从JS中读取它,如下所示:

 document.querySelector('body').dataset.topicId 

您的订阅创建行如下所示:

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