Rails 5ベータ1とActionCableを使用して非常にシンプルなアプリを作成し、ユーザーがオンラインになったことを表示して、お互いにメッセージを送信できるようにしました。
今、私は基本的にActionCableのクライアント側の部分を取り、それを別のアプリのコンテキストで実装します(それはnotを実行しますRails 5)および最初のアプリと接続して、データ(ユーザーのオンラインステータスやメッセージなど)を送受信します。
その2番目のアプリからデータを送信するには、AJAX POST requestを作成するだけでよいと思います。質問は次のとおりです。登録方法2番目のアプリから最初のアプリのオープン接続へ?
または:API経由で別のアプリからRailsアプリのActionCable接続にサブスクライブするにはどうすればよいですか?
私の推測では、基本的にこのコーヒースクリプトを2番目のアプリに何らかの形で含めたいと思います。
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) ->
# ...
Mwalsherの解決策は非常に役に立ちましたが、最近、Railsリポジトリに私の質問に対する公式の解決策が記載されたプルリクエストが見つかりました。
https://github.com/Rails/rails/pull/24991
近い将来、これはメインのドキュメントに追加されると思います。これが公式のactioncable npmパッケージへのリンクです: https://www.npmjs.com/package/actioncable
Mwalsherのソリューションと同様に、任意のJSアプリで使用できます。 npmパッケージをインストールするだけです。
npm install actioncable --save
ここにドキュメントのJSの例があります:
ActionCable = require('actioncable')
var cable = ActionCable.createConsumer('wss://Rails-API-PATH.com/cable')
cable.subscriptions.create('AppearanceChannel', {
// normal channel code goes here...
});
編集:プルリクエストがしばらくマージされましたが、説明は公式の一部です Readme -ただではありませんまだRails Guides。
基本的には、ActionCable JSコードのコピーまたはポートを他のアプリに含める必要があります( https://github.com/Rails/rails/tree/master/actioncable/app/assets/javascripts =)。
更新:私は最近、Ruby on Rails 5's ActionCable CofeeScript to Rails外で使用するためのダイレクトポート)を提供するactioncable-jsと呼ばれるnpmパッケージをリリースしました: https://github.com/mwalsher/actioncable-js
ActionCableはHTML5 WebSocketsの上のレイヤーにすぎないため、生のWebSockets JSコード(またはサードパーティのライブラリ)を使用してメッセージングを処理することもできます。
ActionCableメッセージプロトコルについては、多少文書化されています: https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol 。便宜上、以下に貼り付けます。
接続が成功したら、サブスクライブメッセージを送信します
{"command":"subscribe","identifier":"{\"channel\":\"MeshRelayChannel\"}"}
{"identifier"=>"{\"channel\":\"MeshRelayChannel\"}", "type"=>"confirm_subscription"}
登録すると、メッセージを送信できます。
{"command":"message","identifier":"{\"channel\":\"MeshRelayChannel\"}","data":"{\"to\":\"user1\",\"message\":\"hello from user2\",\"action\":\"chat\"}"}
ノート:
identifier
とdata
は冗長にjson化されています。したがって、たとえば(Rubyの場合)
payload = {
command: 'command text',
identifier: { channel: 'MeshRelayChannel' }.to_json,
data: { to: 'user', message: 'hi', action: 'chat' }.to_json
}.to_json