2016-11-22 25 views
1

Rails5を使用してアプリケーションのAPIプロバイダを作成していますが、websocketを使用する必要があります。ブロードキャストを受信して​​いません

routes.rbを

Rails.application.routes.draw do 

    mount ActionCable.server => '/cable' 

    get '/testbroad', to: 'messages#testbroad' 

end 

messages_channel.rb

class MessagesChannel < ApplicationCable::Channel 

    def subscribed 
    stream_from 'messages' 
    end 

end 

messages_controller.rb

その後、私はテストのための非常に簡単なコードを作成しましたその後

class MessagesController < ApplicationController 

    def testbroad 
    ActionCable.server.broadcast('messages', 
           message: 'foo') 
    head :ok 
    end 

end 

、私はそれが仕事だcURLの

➜ ~ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: ws://localhost:3000/cable" http://localhost:3000/cable 
HTTP/1.1 101 Web Socket Protocol Handshake 
Upgrade: WebSocket 
Connection: Upgrade 
WebSocket-Location: ws://ws://localhost:3000/cable/cable 

{"type":"welcome"} 

を使用して接続を開始しました!しかし、私がブロードキャストを送信しようとすると...

➜ ~ curl http://localhost:3000/testbroad 

Railsのコンソールは成功を示していますが、cURLには何のメッセージも表示されません。なぜ私は "foo"というメッセージを受け取らなかったのですか?それを解決するには?

答えて

1

数時間後、問題が見つかりました。

このイメージは、WebSocket接続を開始したページのネットワークデバッグです。 enter image description here テーブルの最初の行に、ブラウザがサーバーに送信するメッセージ({"command":"subscribe","identifier":"{\"channel\":\"MessagesChannel\"}"})が表示されます。

接続を確立したら、登録したいチャンネルのメッセージを送信する必要があります。 Railsのドキュメントには書かれていません。

+0

私は、この問題のアクションケーブルがどのように機能するかについての回答を掲載しました。この問題をよりよく理解できるように教えてください。ありがとう –

0

これもよく分かりますので、基本的には購読していますが、メッセージを投稿していません。彼らはここで重要なのは、サブスクリプションが、私はdocumentation

3.2.2サブスクリプション

消費者として動作し、チャンネルに加入引用ファイルapp/channels/messages_channel.rb

に設定されているmessages#testbroad

ActionCable.server.broadcast('messages', 
          message: 'foo') 
head :ok 

を実行していました加入者。それらの接続はサブスクリプションと呼ばれます。次に、生成されたメッセージは、ケーブル消費者によって送信された識別子に基づいて、これらのチャネルサブスクリプションにルーティングされます。

def subscribed 
    stream_from 'messages' 
end 

が、私はケーブルの消費者により送信された識別子に基づいて、そのチャンネル

に加入している消費者を理解することができると確信してい

(ケーブル消費者は、 redis dbから読み込んだもの)。これにより、通知を受信したいユーザと、アクティブチャネルに登録されていないユーザが分かるので、App.cable.subscriptions.create('MessagesChannel')がメッセージをクライアントのフロントエンドに投稿するようになります。

App.cable.subscriptions.create('MessagesChannel', {  
    received: function(data) { 
     $('#messages').append(this.renderMessage(data)); 
    }, 
    renderMessage: function(data) { 
     return "<br><p> <strong>" + data.user + ": </strong>" + data.message + "</p>"; 
    } 
}); 

私は約ActionCableを議論し、理解を得るために答えを掲示しています。私はあなたがすでに問題を解決したことを知っています。しかし、これについて話したいと思います。

それは私にはまだ分かりません!

関連する問題