Как передать сообщение клиенту, а не подписаться на тему в Action Cable - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу использовать Action Cable (Rails 5) для создания приложения чата.

Когда клиент входит в приложение, я отправляю сообщение, чтобы подписаться на канал. Канал будет транслироваться для соединения на основе current_user room_id. Когда пользователь отправляет сообщение, оно будет отправлено всем, кто подписался на канал Это нормальный поток действий кабеля.

Вот мой канал:

class RoomChannel < ApplicationCable::Channel
  def subscribed
   current_user.chatrooms.each do |chatroom|
       stream_from "room_#{chatroom.id}"
   end
 end
end

Но мне интересно, когда клиент отправляет сообщение новому, которого нет в комнате. Потоковое не было создано. Как другой может получить сообщение и продолжить разговор?

1 Ответ

0 голосов
/ 17 сентября 2018

Для пользователя, отправляющего сообщение, вы можете создать обратный вызов в вашей модели сообщений, который будет транслироваться на ваш канал при создании сообщения.Я полагаю, вы создали правильные ассоциации.т.е. номера has_many сообщений.Сообщение по очереди belongs_to Room и User Примерно так:

class Message < ApplicationRecord
    after_create :broadcast_to_room
    .......
    private
    def broadcast_to_room
        @room = self.room
        RoomChannel.broadcast_to(@room, message: self)
    end
    .........
end

Таким образом, при создании сообщения оно транслируется в комнату, которой принадлежит сообщение.Ваш RoomChannel может выглядеть следующим образом:

class RoomChannel < ApplicationCable::Channel
    def subscribed
        room = Room.find(params[:id])
        stream_for room
    end
end

Теперь на странице со стороны комнаты должна быть функция, которая подписывается на прослушивание входящих сообщений.Поэтому, когда приходит сообщение, ваш слушатель берет сообщение и отображает его.Я написал здесь о том, как вы можете использовать actioncable на клиенте (в реагировать на нативную).В вашем клиенте вы создаете сокет, который прослушивает входящие сообщения.

...