don-bra.co

さいきんはphpとたわむれてます

rails5.0.0にアップデートしてwebsocketのエラーがでたとき

問題の詳細

rails4.2からrails5.0.0にアップデートしてActionCableを使おうとしていました。

rails g channel message add
でmessage.jsとmessage_channel.rbが作られたことを確認します。
次にブラウザのコンソールから App.message.add()をするとfalseが返ってきて 常に以下のエラーがでている状態でした。

ブラウザのエラーがこちらで
WebSocket connection to 'ws://localhost:3000/cable' failed: Unexpected response code: 500

コンソールではこちらのエラーが表示されていました。
NotImplementedError (only partial hijack is supported.):

むむむ。。。

解決まで

色々と調べていたのですがふと思い出したことがあります。
ActionCableは余っているプロセスを使って動作するために、Rails5ではデフォルトのアプリケーションサーバがPumaに変更されているという話です。
WEBrickだとシングルプロセスのためにActionCableが動作しないということです。

もっと詳しく知りたい方は以下のリンクを見ることをおすすめします!
Riding Rails: Rails 5.0.0.beta1: Action Cable, API mode, Rails command

In development, Action Cable runs in-process with the rest of your app. To do this, we’ve switched the default development server from Webrick to Puma.

ActionCableのREADMEにもかいてありますね。 github.com

Action Cable does not work with WEBrick, because WEBrick does not support the Rack socket hijacking API.

ということでGemfileに gem 'puma' を追加して
bundle exec rails s Pumaをすることで解決しました。