そろそろAction Cableを触っておきたいけど重い腰が上がらない...という人へ

## 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が動く環境があれば、公式サンプルの[インストラクション](https://github.com/rails/actioncable-examples)に従ってコマンドを打つだけで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修正

```config/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`

## ブラウザで確認

こんな感じです↓
![actioncable.gif](https://qiita-image-store.s3.amazonaws.com/0/74529/3a824ff7-5a31-3327-14b0-c14e7afc7c09.gif)

注１）片方もしくは両方のタブはシークレットモードなどを使って、クッキーが共有されないようにしてください
注２）うまく動かないときは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を使っているとすると

```development.rb
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エンジニアの必須スキルになっていくのは間違いなさそうなのでいまのうちにいじっておきましょう( ・∀・)ﾉ