Introduction
ここ一週間くらいAction Cableをいじっていますが、思っていたほど仰々しいものではなかったな。というのが正直な感想です。
僕と同じようにビビりすぎている人が多いような気がしてこの記事を書くことにしました。
とりあえず公式サンプルを動かしてみると「めんどくさそうだな〜」感はかなり薄れる、いやむしろ拍子抜けするかもです。
Action Cable触ってみなきゃ、と思い始めて気がつけば◯ヶ月、、、
みたいな人はぜひこれを期に挑戦してみてください(☝ ՞ਊ ՞)☝
actioncable-examplesのソースコードなど
なにはともあれREADMEは読んでおきましょう
https://github.com/rails/rails/tree/master/actioncable
公式サンプルのソースコードを以下からcloneしてください
https://github.com/rails/actioncable-examples
Rails5.0.0とRedisが動く環境があれば、公式サンプルのインストラクションに従ってコマンドを打つだけでOKです。
この場合コードには一行の修正も加えずに動かすことができるはずです。
伝えたいことは以上ですが、
環境構築がめんどくさい人向けに、Dockerを使って例のソースコードが動くところまでまとめておきます。
ソースコードをclone
$ git clone https://github.com/rails/actioncable-examples.git
Railsのimageを用意
$ docker pull rails
https://hub.docker.com/_/rails/
Deprecatedですが、とりあえずAction Cableを動かすだけなら問題ないです。
詳細はDockerfileを確認してみてください
https://github.com/docker-library/rails/blob/74262f5482517f779681590b0194758ff75cf77c/Dockerfile
Redisのimageを用意
$ docker pull redis
https://hub.docker.com/_/redis/
Redisコンテナ起動
$ docker run --name redis -d redis
cable.yml修正
# production:
# url: redis://redis.example.com:6379
local: &local
# url: redis://localhost:6379
url: redis://redis:6379
development: *local
test: *local
Appコンテナ起動
$ docker run --rm --link redis:redis -p 3000:3000 -p 28080:28080 -v /path/to/your/actioncable-examples/:/actioncable-examples/ -it --name actioncable-examples rails bash
※パスは書き換えてください
bundle installとかmigrationとか
$ cd actioncable-examples
$ ./bin/setup
setupを実行するとbundle installやらdb:createやらいろいろ行われます。
Action Cableサーバ起動
$ ./bin/cable
Railsサーバ起動
ターミナルで別のタブを開く
$ docker exec -it actioncable-examples bash
$ cd actioncable-examples
$ ./bin/rails server --bind=0.0.0.0
ブラウザで確認
注1)片方もしくは両方のタブはシークレットモードなどを使って、クッキーが共有されないようにしてください
注2)うまく動かないときはturbolinksがイベント発火を阻止しているかもしれません。リロードするかturbolinksを切ってみてください(汗
↑↑turbolinks周りがバグっていたのでPR出しました
https://github.com/rails/actioncable-examples/pull/32
VirtualBoxを使うときの注意点
Action Cable will only accept requests from specified origins, which are passed to the server config as an array. The origins can be instances of strings or regular expressions, against which a check for match will be performed.
~中略~
When running in the development environment, this defaults to "http://localhost:3000".
とある通り、Action Cableは許可されたorigin以外からのアクセスを拒否します。
developmentで走らせる場合 http://localhost:3000 がデフォルトで許可される、ということで、
僕の環境(Docker for Macを使用)でlocalhost:3000で試したところ問題なく動作しましたが、localhostでアクセスすることができないVirtualBox+Dockerの場合は少し設定が必要になるはずです。
例えば'default'というhostを使っているとすると
config.action_cable.url = 'ws://default:28080'
config.action_cable.allowed_request_origins = ['http://default:3000']
と修正すればいけそうです。
お気づきのとおりAction CableサーバのURLも変更します。
※動作確認していません。VirtualBox + Dockerを使っている人、もし間違えていたら教えていただければ助かりますm(_ _)m
おわりに
新しい技術を使うときって自分のなかにノウハウ溜まってなくて変なコードを書いてしまいがちなので、公式でサンプルコードを用意してくれているととても助かりますね。
5系をproductionで使っているところはまだ多くないと思いますが、Action CableがRailsエンジニアの必須スキルになっていくのは間違いなさそうなのでいまのうちにいじっておきましょう( ・∀・)ノ