2016-02-10 18 views
16

Ho creato un'app molto semplice utilizzando Rails 5 beta 1 e ActionCable per mostrare quando gli utenti arrivano online e consentono loro di inviare messaggi a vicenda.Come utilizzare ActionCable come API

Ora, io fondamentalmente come prendere la parte client-side di ActionCable, la sua attuazione nel contesto di un'altra applicazione (ciò non si spostano su rotaia 5) e collegarlo con la prima applicazione per inviare e ricevere dati (come lo stato online di utenti o messaggi).

Per inviare dati da quella seconda app, presumo, posso semplicemente effettuare una richiesta POST AJAX. La domanda è: Come posso iscrivermi dalla mia seconda app a una connessione aperta della prima app?

O anche: Come posso abbonarmi alla connessione ActionCable della mia app Rails da un'altra app tramite API?

La mia ipotesi è che in sostanza voglio includere questo CoffeeScript in qualche modo nel mio secondo app:

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) -> 
    # ... 

risposta

16

Mentre la soluzione di mwalsher è stato estremamente utile per me, ho trovato di recente una richiesta di pull sul repository Rails con una soluzione ufficiale alla mia domanda .

https://github.com/rails/rails/pull/24991

presumo, in un prossimo futuro questo sarà aggiunto alla documentazione principale. Ecco il link al pacchetto npm actioncable ufficiale: https://www.npmjs.com/package/actioncable

È possibile utilizzarlo in modo simile alla soluzione di mwalsher con qualsiasi app JS. Basta installare il pacchetto NPM:

npm install actioncable --save 

Ecco l'esempio JS dalla documentazione:

ActionCable = require('actioncable') 

var cable = ActionCable.createConsumer('wss://RAILS-API-PATH.com/cable') 

cable.subscriptions.create('AppearanceChannel', { 
    // normal channel code goes here... 
}); 

Edit: La richiesta di pull è stata fusa per un po ', ora e la descrizione è parte della ufficiale Readme - non ancora nelle guide delle rotaie.

+0

Questa è una grande notizia, grazie Jim! – mwalsher

+0

@jim broski si prega di condividere il repository aperto delle due applicazioni che sarà utile per gli sviluppatori nuovi di rotaie e actioncable. Almeno condividi un post su di esso. Sarà utile. –

17

Avrete essenzialmente necessario includere una copia o una porta del codice JS ActionCable nella vostra altra app (https://github.com/rails/rails/tree/master/actioncable/app/assets/javascripts).

Aggiornamento: Ho recentemente rilasciato un pacchetto di NPM chiamato actioncable-js che fornisce una porta diretta di Ruby on Rails 5 di ActionCable CofeeScript allo standard JS per l'uso al di fuori di Rails: https://github.com/mwalsher/actioncable-js

Perché ActionCable è solo uno strato sulla parte superiore di HTML5 WebSockets, quindi è possibile utilizzare anche il codice JS WebSockets (o qualsiasi libreria di terze parti) per gestire la messaggistica.

Il protocollo del messaggio ActionCable è un po 'documentato qui: https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol. Io incollo qui di seguito per comodità:

  1. Collegare all'URL azione cavo
  2. Dopo la connessione riesce, inviare un messaggio di sottoscrizione

    • La sottoscrizione messaggio JSON dovrebbe assomigliare a questa: {"command":"subscribe","identifier":"{\"channel\":\"MeshRelayChannel\"}"}
    • Si dovrebbe ricevere un messaggio come questo: {"identifier"=>"{\"channel\":\"MeshRelayChannel\"}", "type"=>"confirm_subscription"}
  3. Una volta iscritto, è possibile inviare messaggi.

    • Assicurarsi che la stringa di azione corrisponda al nome del metodo di gestione dati sul server ActionCable.
    • vostro messaggio JSON dovrebbe essere simile a questo: {"command":"message","identifier":"{\"channel\":\"MeshRelayChannel\"}","data":"{\"to\":\"user1\",\"message\":\"hello from user2\",\"action\":\"chat\"}"}
    • I messaggi ricevuti dovrebbero guardare circa la stessa
  4. Note:

    • Ogni messaggio inviato al server ha un tasto di comando e l'identificatore .
    • Il valore del canale deve corrispondere al nome della classe di canale sul server ActionCable.
    • identifier e data sono jsonificati in modo ridondante.

Così, per esempio (in Ruby)

payload = { 
    command: 'command text', 
    identifier: { channel: 'MeshRelayChannel' }.to_json, 
    data: { to: 'user', message: 'hi', action: 'chat' }.to_json 
}.to_json 
+0

Sì. Stavo anche esaminando quello. Mi sembra che non sia così semplice, comunque. Almeno non per me. Ci sono alcune parti che devono essere regolate e non possono semplicemente essere copiate. Sfortunatamente, la porta ES6 sembra non funzionare con la versione più recente di Rails 5. – sam

+0

Aggiornato la mia risposta con un collegamento ad una porta diretta di ActionCable JS: https://github.com/mwalsher/actioncable-js. Speriamo che questo aiuti! – mwalsher

+0

Davvero, davvero bella soluzione. Grazie per averlo messo insieme! Questo è estremamente utile. Ho deciso di pubblicare una risposta da solo perché ho appena trovato una richiesta di pull sul repository Rails con un pacchetto NPM ufficiale. – sam

Problemi correlati