6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails5のActionCableを特定のページのみ使用する

Posted at

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) ->
        # 受信時の処理

以上で、特定のページのみストリーム接続することが可能になりました。

現場からは以上です。

参考

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?