¿Cómo se crean múltiples canales con Actioncable? ¿cómo se pasa una variable en el documento a los canales y trabajos de javascript y ruby?

Por ejemplo, en https://www.youtube.com/watch?v=n0WUjGkDFS0 a las 10:36 menciona la posibilidad de crear múltiples canales, pero ¿cómo podría uno realmente lograr esto?

De acuerdo con Rails 5 ActionCable, establecer el flujo de parameters de URL una variable se puede definir y pasar como un parámetro como:

def subscribed stream_from "room_channel_#{params[:roomId]}" end 

Pero en el file javascript antes de pasar los datos aquí, ¿cómo se pasan los datos de la página? El siguiente ejemplo muestra un error ya que presumiblemente el cable está definido antes de que se cargue el documento.

 App.room = App.cable.subscriptions.create { channel: "RoomChannel", roomId: document.getElementById("message_text").getAttribute("data-room")} 

Entonces, si uno tiene éxito, obtenga los datos del documento en la variable aquí y los pasa al método stream_from, y finalmente, ¿cómo pasa el canal correcto al método de ejecución para ser utilizado en el trabajo de difusión?

  def perform(message) ActionCable.server.broadcast 'room_channel_???', message: render_message(message) #, roomId: roomId end 

¡Gracias!

Aprendí mucho mirando el ejemplo de ActionCable . Yo también estaba confundido por los documentos que sugieren parameters de análisis y comienzan a transmitir inmediatamente en la suscripción. Si bien esta es una opción , es posible que prefiera el enfoque a continuación.

Cree un método especial que pueda start_listening desde el lado del cliente (JS), algo así como start_listening :

 class RoomChannel < ApplicationCable::Channel # Called when the consumer has successfully # become a subscriber of this channel. def subscribed end def start_listening room_data stop_all_streams # optional, you might also keep listening... stream_for Room.find(room_data['room_id']) end def stop_listening stop_all_streams end end 

Con este código (y reinicio del server) ahora puede llamar a la siguiente línea cuando realmente ha cargado la habitación:

 App.roomChannel.perform("start_listening", {room_id: 20}); 

Ahora puede transmitir datos para la sala en cualquier lugar usando broadcast_to . Por ejemplo, desde un roomMessage after_safe -action:

 RoomChannel.broadcast_to(room, room_message) 

Esto transmitirá el post a todos los que están escuchando.

Al separar el momento en que comienza a escuchar una transmisión de la apertura de la connection, facilita la configuration de múltiples flujos de datos (existe una connection que puede tener muchos canales que pueden tener muchas transmisiones) (simplemente no cierre las transmisiones anteriores) al comenzar uno nuevo;)). El time de configuration de la connection también es un poco más rápido, aunque normalmente tiene el precio de tener una connection abierta tal vez tan pronto como un usuario inicie session, algo que podría solucionar fácilmente al suscribirse justo antes de comenzar a escuchar.

Se me ocurrió 2 soluciones a este problema.

  1. Este es un poco tonto, puedes analizar URL. Siempre quieres la parte después del último "/", así que gracias a REST esta es una opción viable.
  2. Mejor: puede envolver todo el código de suscripción de su cliente en function de la carga de documentos. De esta forma, tiene todos los datos de la página disponibles para usarlos para crear una nueva suscripción.

Espero que respondas si encuentras una solución más limpia.

    Intereting Posts