Railsで使えるGem

ActionCableのサンプルをみてみた

投稿日:2015年12月20日 更新日:

ActionCableとは

ActionCableは、railsでWebSocketを利用したリアルタイム通信を可能にするgem.
rails5から、railsの本体に取り込まれる.
github.com/rails/actioncable

詳しい情報は、
github.com/rails/actioncable/tree/archive

公式サンプルは、ここ
github.com/rails/actioncable-examples

公式サンプルの動画解説は、ここ
gorails.com/episodes/rails-5-actioncable-websockets

今回は、この記事のチャットアプリを試してみた.
Getting started with Rails 5’s ActionCable and websockets

rails4での利用

Gemfileに追加する.
サーバーはpumaを使うので、これも追加しておく.
今回は、ruby 2.2.1 rails 4.2.5の環境で実行した.

redisサーバーの準備

macの場合、brewでインストールしておく.

redisの仮起動は次の通り.

cableサーバーの準備

ApplicationCable::ConnectionとApplicationCable::Channel

まず、2つのクラスを作る必要がある.
app/channels/application_cable/以下にファイルを2つ作る.

ApplicationCable::Connection では、入ってくる接続を許可したりする.

ApplicationCable::Channel では、Channel間で共通のロジックを書いたりする.

config/redis/cable.yml

redisサーバーのpubsubを使っているらしいのでredisの設定ファイルも作る.
:が前後にあるので注意.

cable/config.ru

cableサーバーは別プロセスで動くので、それ用のrackファイルを作成する.

bin/cable

サーバー起動用のスクリプトファイルを作っておく.

次の通り実行権限を与えておく.

cableサーバーの起動

これで、 bin/cable でcableサーバーが起動する.

チャットアプリの内容

cable部分以外のRailsのプログラムの流れ

1 root ‘sessions#new’ → views/sessions/new.html.erb

config/routes.rbでルートアドレスにアクセスすると、まず、views/sessions/new.html.erbに飛ぶ
views/sessions/new.html.erbではusernameをPOSTするフォームがある.

2 POST ‘sessions#create’

usernameをPOSTすると、sessions_controllerでcookie.signed[:username]に保存.
その後、messages_pathにリダイレクト.

3 views/messages/index.html.erb

views/messages/index.html.erbには、フォームからremoteで[:message][:body]を/messagesにPOSTできる.
また、div id=”messages” があってmessages一覧を表示する場所が用意されている.

Channelクラスの作成

クライアントがChannelクラスを購読(subscribe)すると、subscribedメソッドが呼ばれる.

stream_fromメソッドは、名付けられたbroadcastingからstreamを開始する.
www.rubydoc.info/github/rails/actioncable/ActionCable%2FChannel%2FStreams%3Astream_from
上で定義したApplicationCable::Channelを継承して使う.

‘messages’ streamにbroadcastする

*今回はデータベースに保存しないので単純にcontrollerからbroadcastしてるけど、DHHのサンプルでは、Modelで保存後にJobを呼び出してBroadcastしている.

クライアントサイドでcableサーバーに接続

cableをrequireして、JaveScript(CoffeeScript)でサーバに接続する.

また、application.jsで、 require_tree .の前に、 channelsライブラリをrequireしておく.

クライアントサイドでChannelを購読する.

クライアントがWebSocketから何かを受け取ると、App.messages.received関数が呼び出される.

できた

こんな感じでブラウザを2つ並べると、リアルタイムで更新されることがわかる.
screenshot

Rails5では、アクションの外でrender viewsができるようになるらしい.
これを使えば、Javascriptの代わりにhtmlをそのまま発行できる.

情報

ActionCableコードリーディングその1
ActionCableコードリーディングその2

-Railsで使えるGem
-,

執筆者:

関連記事

no image

Rails3.2でajaxなフォルダツリーを導入する3~dynatree-rails & jQuery UI dialog

  前回 Rails3.2でajaxなフォルダツリーを導入する~dynatree-rails Rails3.2でajaxなフォルダツリーを導入する2~dynatree-rails &nbsp …

Rails3.2で位置情報を日本語表示の住所に変換する~geocoder

ついにブログ記事が100件突破した! そのうちメニュー項目などをわかりやすく構成し直したいと思う いまはRailsのプログラムが楽しくて仕方ない時期なので色々と試して書き溜めたいと思う EverNot …

Rails4.1で全文検索〜rroonga

By: Vinoth Chandar – CC BY 2.0 目次1 RailsでGroongaを使う選択肢2 サンプルのアプリ3 Gemfile4 データベースへの接続5 スキーマの設定 …

no image

Private_pubでのJSON通信の方法

  前回 Rails3.2でBackbone.jsとPrivate_pubでToDoアプリをリアルタイム化(できた!)   Gemfileへの追加とbundleの実行 privat …

Rails4とD3.jsでローソク足グラフを描く〜d3.js編

前回 Rails4とD3.jsでローソク足グラフを描く〜Rails準備編 目次1 jsonデータ2 y_scaleを考える3 始値と終値から箱をつくる4 高値と安値でひげをつくる5 y_axisをつけ …