【问题标题】:ActionCable: How to use dynamic channelsActionCable:如何使用动态频道
【发布时间】:2016-08-23 22:26:09
【问题描述】:

我已经使用 Rails 5 和 ActionCable 建立了一个简单的聊天,其中我有一个简单的“聊天”频道。

如何使频道订阅和消息广播动态化,以便我可以创建聊天频道并将消息发送到正确的频道?

很遗憾,我找不到一个这样的代码示例。

更新

下面的答案是正确的。我还发现它现在在 Rails 指南中提到。不要以为在http://edgeguides.rubyonrails.org/action_cable_overview.html#client-server-interactions-subscriptions之前就有了

【问题讨论】:

    标签: ruby-on-rails-5 actioncable


    【解决方案1】:

    javascripts/channels/room.js 中为您的订阅创建传递一个 roomId:

    MakeMessageChannel = function(roomId) {
      // Create the new room channel subscription
      App.room = App.cable.subscriptions.create({
        channel: "RoomChannel",
        roomId: roomId
      }, {
        connected: function() {},
        disconnected: function() {},
        received: function(data) {
          return $('#messages').append(data['message']);
        },
        speak: function(message, roomId) {
          return this.perform('speak', {
            message: message,
            roomId: roomId
          });
        }
      });
    
      $(document).on('keypress', '[data-behavior~=room_speaker]', function(event) {
        if (event.keyCode === 13) {
          App.room.speak(event.target.value, roomId);
          event.target.value = "";
          event.preventDefault();
        }
        return $('#messages').animate({
          scrollTop: $('#messages')[0].scrollHeight
        }, 100);
      });
    };
    

    channels/room_channel.rb 中,它可以作为订阅创建的参数使用,并且说话动作也只是使用正确的数据调用:

      def subscribed
        stream_from "room_channel_#{params[:roomId]}"
      end
    
      def speak(data)
         Message.create! text: data['message'], room_id: data['roomId']
      end
    

    然后,如果您是从工作中广播:

      def perform(message)
        ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message)
      end
    

    【讨论】:

    • 当您有多个聊天室时,这是如何工作的?使用您的示例,如何订阅 roomA 和 roomB 并根据用户是否有权访问房间在服务器上授权它们?
    • 那么如何将@room.id 从控制器传递给 room.js?
    • 对我有用的是将MakeMessageChannel 的行更改为:$(document).on("turbolinks:load", function () {,然后从我存储在 HTML 标记中的数据属性中获取room_id
    猜你喜欢
    • 2016-05-15
    • 2017-12-12
    • 1970-01-01
    • 2019-12-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多