首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 5 ActionCable从URL参数建立流

Rails 5 ActionCable从URL参数建立流
EN

Stack Overflow用户
提问于 2016-03-16 20:20:03
回答 2查看 5.1K关注 0票数 6

我对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的客房控制器处理这些路线没有问题:

代码语言:javascript
复制
class RoomsController < ApplicationController
  def show
    @topic = params[:topic]
    @messages = Message.all
  end
end

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

代码语言:javascript
复制
class RoomChannel < ApplicationCable::Channel
  def subscribed
    stream_from "room_channel_#{params[:topic]}"
  end

只返回"room_channel_“

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-16 21:42:02

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

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

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

代码语言:javascript
复制
App.room = App.cable.subscriptions.create "RoomChannel",

代码语言:javascript
复制
App.room = App.cable.subscriptions.create { channel: "RoomChannel", topic: topic},

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

票数 12
EN

Stack Overflow用户

发布于 2017-10-25 10:20:59

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

代码语言:javascript
复制
<body data-topic-id="<%= @topic.id %>">

现在从JS中读到这样的内容:

代码语言:javascript
复制
document.querySelector('body').dataset.topicId

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

代码语言:javascript
复制
App.room = App.cable.subscriptions.create (channel: 'RoomChannel', topic_id: document.querySelector('body').dataset.topicId)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36046155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档