2016-08-26 11 views
9

非常に基本的な質問に対する答えであると思われるものについて、私は広範囲(広範囲のコード例をActionCableで読むことを含む) 。ああ、私は私の問題を解決していません。Ruby on Rails 5アクションケーブル:現在のモデルインスタンスのストリーム(URLベースのサブスクリプション)

私はモデルSearchを持っていて、URL /searches/1にナビゲートしたとします。

私もで始まるjavascripts/channels/search.coffeeファイルなければなりません:

App.instance = App.cable.subscriptions.create 'SearchChannel' 

とこのようになりますSearchChannelクラス:

class SearchChannel < ApplicationCable::Channel 
    def subscribed 
    search = Search.find(params[:id]) 
    stream_for search 
    end 

    def unsubscribed 
    end 
end 

当然のことながら、上記のコードがあるため、エラーを生成しparams[id]nilです。

ここに私の質問は以下のとおりです。

  • は、どのように私はURLに基​​づいて正しいSearchインスタンスに加入していますか?
  • サブスクリプションを必要としない別のURLを使用している場合は、SearchChannelに登録しないでください。 /searches/1/results

ありがとうございました!

答えて

1

ActionCable.Subscriptions#createの実装を見ると、2通りの方法で呼び出すことができます。 (CHANNELNAME付き)

オプション1:

App.cable.subscriptions.create 'SearchChannel' 

オプション2(チャネルオブジェクトで):あなたはオプション1で行く場合

App.cable.subscriptions.create channel: 'SearchChannel', id: 'Best Room' 

、内部的に、それはに変換されますchannelオブジェクトです。だから、

、あなたはサーバー側でidをキャプチャしたい場合、あなたは、あなたはあなたが説明するように、サーバー側でそれをキャプチャすることができるはず、第二オプションを使用してsearchidに合格する必要があります。

class SearchChannel < ApplicationCable::Channel 
    def subscribed 
    search = Search.find(params[:id]) 
    stream_for search 
    end 

    def unsubscribed 
    end 
end 

詳細はClient-Server Interactions and Subsciptionsを参照してください。

+1

ご回答ありがとうございますが、これは私を助けません。私はすでにドキュメントでこのオプションについて読んでいましたが、私が混乱しているのは、その 'id'を' SearchChannel'に送る方法です。 Railsは 'javascripts/channels /'の下に 'search.coffee'を置きます。つまり、' id'をそのファイルのどこかから渡す必要があります。それが私の難しさにあります。 – Vadim

+2

'SearchChannel'サブスクリプションで何を達成しようとしているのかよくわかりません。しかし、 '@ search.id'をRuby側からjavascript側に取得する必要がある場合は、複数のオプションがあります。オプション1:あなたが '/ searches/1'のurlにいる間、javascriptのurlを解析し、urlの' id'を 'App.cable.subscriptions.create'に渡すことができます。オプション2: 'show'テンプレートの先頭にjavascriptで' id'を格納します。例:<%= javascript_tag "var search_id =#{params [:id]}"%>そして 'search_id'を' App.cable。subscriptions.create'。希望が役立ちます。 – Dharam

関連する問題