ruby on rails - real - Cómo usar ActionCable como API
ruby on rails real time updates (2)
Básicamente, deberá incluir una copia o puerto del código ActionCable JS en su otra aplicación ( https://github.com/rails/rails/tree/master/actioncable/app/assets/javascripts ).
Actualización: recientemente lancé un paquete npm llamado actioncable-js que proporciona un puerto directo de ActionCable CofeeScript de Ruby on Rails 5 a JS estándar para uso fuera de Rails: https://github.com/mwalsher/actioncable-js
Debido a que ActionCable es solo una capa sobre HTML5 WebSockets, también puede usar el código WebSockets JS sin procesar (o cualquier biblioteca de terceros) para manejar la mensajería.
El protocolo de mensajes de ActionCable está algo documentado aquí: https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol . Voy a pegar a continuación para mayor comodidad:
- Conectarse a la URL del cable de acción
Después de que la conexión sea exitosa, envía un mensaje de suscripción
- El mensaje de suscripción JSON debe tener este aspecto:
{"command":"subscribe","identifier":"{/"channel/":/"MeshRelayChannel/"}"}
- Debería recibir un mensaje como este:
{"identifier"=>"{/"channel/":/"MeshRelayChannel/"}", "type"=>"confirm_subscription"}
- El mensaje de suscripción JSON debe tener este aspecto:
Una vez suscrito, puedes enviar mensajes.
- Asegúrese de que la cadena de acción coincida con el nombre del método de manejo de datos en su servidor ActionCable.
- Su mensaje JSON debe verse así:
{"command":"message","identifier":"{/"channel/":/"MeshRelayChannel/"}","data":"{/"to/":/"user1/",/"message/":/"hello from user2/",/"action/":/"chat/"}"}
- Los mensajes recibidos deben tener el mismo aspecto.
Notas:
- Cada mensaje enviado al servidor tiene una clave de comando e identificador.
- El valor del canal debe coincidir con el nombre de la clase de canal en el servidor ActionCable.
-
identifier
y losdata
son jsonified redundantemente.
Así, por ejemplo (en rubí)
payload = {
command: ''command text'',
identifier: { channel: ''MeshRelayChannel'' }.to_json,
data: { to: ''user'', message: ''hi'', action: ''chat'' }.to_json
}.to_json
Construí una aplicación muy simple con Rails 5 beta 1 y ActionCable para mostrar cuándo los usuarios se conectan y les permiten enviar mensajes entre ellos.
Ahora, básicamente me gustaría tomar el lado del cliente de ActionCable, implementarlo en el contexto de otra aplicación (que no se ejecuta en Rails 5) y conectarlo con la primera aplicación para enviar y recibir datos (como el estado de los usuarios o mensajes).
Para enviar datos desde esa segunda aplicación, asumo que simplemente puedo realizar una solicitud POST AJAX. La pregunta es: ¿Cómo me suscribo desde mi segunda aplicación a una conexión abierta de la primera aplicación?
O incluso: ¿Cómo me suscribo a la conexión ActionCable de mi aplicación Rails desde otra aplicación a través de la API?
Mi conjetura es que, esencialmente, quiero incluir este coffeescript de alguna manera en mi segunda aplicación:
App.appearance = App.cable.subscriptions.create "AppearanceChannel",
connected: ->
# Called when the subscription is ready for use on the server
disconnected: ->
# Called when the subscription has been terminated by the server
received: (data) ->
# ...
Si bien la solución de mwalsher fue extremadamente útil para mí, recientemente encontré una solicitud de extracción en el repositorio de Rails con una solución oficial para mi pregunta.
https://github.com/rails/rails/pull/24991
Supongo que, en un futuro próximo, esto se agregará a la documentación principal. Aquí está el enlace al paquete oficial de Actioncable npm: https://www.npmjs.com/package/actioncable
Puede usarlo de forma similar a la solución de mwalsher con cualquier aplicación JS. Solo instala el paquete npm:
npm install actioncable --save
Aquí el ejemplo de JS de la documentación:
ActionCable = require(''actioncable'')
var cable = ActionCable.createConsumer(''wss://RAILS-API-PATH.com/cable'')
cable.subscriptions.create(''AppearanceChannel'', {
// normal channel code goes here...
});
Edición: la solicitud de extracción se ha fusionado por un tiempo, ahora y la descripción es parte del Readme oficial, pero aún no está en las Guías Rails.