2016-10-26 11 views
5

私は乱雑にコード化されたPHPの怪獣を置き換えるために一緒にレールアプリを取得しようとしています。現在のインカネーションは、Rails以外のデータベースからRailsデータベースにデータを引き込み、それをビューに表示しています。 dbには、主に数秒ごとに追加される温度値が入力されます。私はRailsに問題なく静的なページを表示できますが、ActionCable /リアルタイムデータを追加しようとすると問題があることが判明しました。ほとんどのことが適切に機能しているようですが、自分のチャンネルにブロードキャストすると、mychannel.coffeeのReceived関数にヒットしないようです。アクション可能な放送が受信JS機能を受信しません

マイセットアップ: サーバ - 旅客(execの乗客の開始をバンドル) ジョブズ - Resque ActionCable - Redisの

データは生のSQLをつかみ、新しいレコードを作成し、ジョブによってlegacydbから輸入されます。その後、別のジョブがチャンネルにブロードキャストされます。

問題はActionCableから来ていると私は思います。私が見つけることができるすべての例では、JSをトリガーするユーザー入力が必要です。しかし、私は厳密にサーバー側から物事を引き起こそうとしています。この仕事:

class DatabroadcastJob < ApplicationJob 
    queue_as :default 
    self.queue_adapter = :resque 


    def perform 
    ActionCable.server.broadcast 'dashboard_channel', content: render_thedata 
    end 

    private 

    def render_thedata 
     dataArr =[Data1.last, Data2.last, Data3.last] 
     ApplicationController.renderer.render(partial: 
      'dashboard/data_tables', locals: {item: dataArr}) 
    end 

end 

作品。できます。私は放送がdashboard_channelに当たっているのを見ます。しかし、ダッシュボードの中の何も、ブロードキャストによって引き起こされるものはありません。これは非常に混乱しています。

Dashboard.coffee

App.dashboard = App.cable.subscriptions.create "DashboardChannel", 
     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) -> 
     # Called when there's incoming data on the websocket for this channel 
     alert data['content'] 

何も起こりません。ログにはブロードキャストが表示されますが、dashboard.coffeeには何も表示されず、ブラウザにアラートが表示されます。すべてのチャットの例のために私はこれについて間違った方法を考えていますか?私は放送をつかんで、それを加入者に押し付ける別の場所はありますか?

これに対処するために他の情報が必要な場合は、私にお知らせください。この問題は、今、私を日々精神的に動かしています。

答えて

1

まず、フレームを確認します。あなたはあなたが望むメッセージを受け取っていますか?

enter image description here

その後、自分のチャンネルでは、あなたの潜水艦にIDを設定する必要があります。モデルに関連するストリームがある場合、モデルとチャネルから使用されるブロードキャストを生成できます。

class DashboardChannel < ApplicationCable::Channel 
    def subscribed 
    post = Post.find(params[:id]) 
    stream_for post 
    end 
end 

その後、あなたはそれ以外の場合はそう

DashboardChannel.broadcast_to(@post, @comment)

のようなあなたのチャンネルに放送することができ、次の操作を行う必要があります。

class DashboardChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from 'dashboard_channel' 
    end 
end 

しかし、あなたが勝ったので、これは、悪い習慣ですどのユーザーがサーバーに送信するかを定義することはできません。

+0

ガイダンスをありがとうございます。私は放送を稼働させることができましたが何らかの理由でアラートをポップアップしたくないようでした。私の最終的なユースケースでは、ダッシュボードコントローラのcoffeescriptでjQuery関数を作成して部分的な部分を再描画しました。私はばかだからdiv属性に "id"の代わりに "name"を使用していたので、そこにも問題がありました。乾杯! – Scaylos

+2

私が強調したいことの一つは、 'stream_for'と' stream_from'の主な違い*です。これは私を見つけるのにしばらく時間がかかりました。私は 'stream_forを使って名前付きストリームで放送していましたが、うまくいきませんでした。' stream_from'が必要でした。これに注意してください。 –

0

コーヒー/ジャバスクリプトのトラブルシューティングとテストのために追加することは、console.logはあなたの友人です。 console.log "First step complete"などを追加すると、実際にエラーが発生していた場所を追跡するのに役立ちました。

関連する問題