Предисловие

ActionCable — надстройка над рельсами для websocket. Содержит в себе как frontend (js) так и backend части. Документацию описывать не буду, примеры кода приводить тоже не буду, но опишу проблему, с которой я столкнулся и на которую потратил больше часа времени.

Проблема

Как это обычно бывает, сделал “как в документации”, но при попытке подписаться в логах unicorn’а, ответственного за ActionCable я увидел вот это:

web-sockets_1 | Rack::Lint::LintError: Status must be >=100 seen as integer
web-sockets_1 | 	/usr/local/bundle/gems/rack-2.0.1/lib/rack/lint.rb:20:in `assert'
web-sockets_1 | 	/usr/local/bundle/gems/rack-2.0.1/lib/rack/lint.rb:620:in `check_status'
web-sockets_1 | 	/usr/local/bundle/gems/rack-2.0.1/lib/rack/lint.rb:51:in `_call'
web-sockets_1 | 	/usr/local/bundle/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call'
...

WTF?

Гугление сначала указывает на проблемы с faye, что нам совершенно не интересно. Но дальше в поиске я обнаружил вот этот issue. Если вкратце, то ActionCable устанавливает статус ответа в -1, а включенный unicorn’ом в development-окружении Rack::Lint требует

status.to_i >= 100

Решение

Я для себя выбрал более простой и бездумный путь: использовать Puma. Просто потому что puma не включает в себя Rack::Lint.

Найти способ отключить Rack::Lint я не смог, хотя и не искал особо долго.