Rails5から導入されたActionCableは、Websocketを使ってブラウザとサーバ間を持続的に接続し、リアルタイムで相互通信をする仕組みです。業務で使用するために調査をしていたのですが、どうも特定のページのみ使用するような仕組みにはなっておらず、Railsの公式ドキュメントのまま適用すると、全てのページでストリーミング接続してしまいます。
ググってみてもなかなか日本語での解説は見つからなかったのですが、海外では同様の問題を考えているサイトがいくつか見つかりました。それらを参考に、最終的に以下のように対応しました。
まず、application.html.erbのbodyタグにコントローラ名、アクション名を埋め込みます。
app/views/layouts/application.html.erb
<html>
...
<body class="<%= controller_name %> <%= action_name %>">
...
</body>
</html>
次に、クライアント側サブスクリプションで特定クラスのみ接続するよう変更します。以下コードの冒頭2行を追加します。(hogeチャンネルを作成し、fooコントローラーのbarアクションのみで使用したい場合)
app/assets/javascripts/channels/hoge.coffee
$(document).on "turbolinks:load", ->
if $(".foo.bar").length > 0
App.response = App.cable.subscriptions.create "HogeChannel",
received: (data) ->
# 受信時の処理
以上で、特定のページのみストリーム接続することが可能になりました。
現場からは以上です。