ActionCable, который ожидается в Rails 5, наконец на этой неделе был замержен в мастер ветку Rails. Давайте создадим простой чат на его основе.
Если вы не знаете, что такое ActionCable, то это библиотека, которая позволяет интегрировать WebSocket-ы c вашим Rails-приложением Т.е мы имеем необходимый инструмент как на стороне клиента, так и на стороне сервера.
Итак, нам понадобится:
- Установленный Redis (для пользователей Ubuntu достаточно одной команды
sudo apt-get install redis-server
) - Rails 4.2 +
Создаем костяк проекта
Назовем его chat, пропускаем установку gems, с помощью опции -B
1
|
|
Теперь о необходимых гемах для работы нашего чата, нам понадобится:
- Сервер приложения - Puma. Webrick тут не подходит так как ActionCable использует отдельный процесс нашего App сервера, и поэтому нам нужен многопоточный сервер Puma или Thin
- Шаблонизатор slim (просто привычка работать именно с ним)
- ActionCable
Ваш Gemfile должен выглядеть примерно вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Выполняем установку gems, bundle install
Структура проекта
В нашем проекте будут контроллеры:
- MessagesController - будет отвечать за вывод сообщений и их создание
- SessionsController - в нем мы создадим простую cookie-аутентификацию для пользователя
При создании контроллеров будем использовать дополнительные опции, –no-helper и –no-assets, чтобы не “плодить” лишние файлы.
Контроллеры и маршруты
Создаем контроллер Sessions
1
|
|
Добавляем create action
1 2 3 4 5 6 7 8 |
|
Создаем контроллер Messages
1
|
|
Action для index не обязателен, мы его опустим, создадим action create
1 2 3 4 5 6 7 |
|
В нем мы возвращаем заголовок :ok
для ajax запроса.
Теперь пропишем маршруты для наших контроллеров в routes.rb
1 2 3 4 5 6 |
|
Корень нашего чата будет вести на логин пользователя
Создаем View
Для начала создадим страничку new
для SessionsController
, в которой будет простая форма с одним инпутом
1 2 3 4 5 6 |
|
Теперь создадим страницу на которой будут выводиться все сообщения и в ней будет находиться форма с созданием нового сообщения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Здесь мы выведем имя залогинившегося пользователя, и создадим контейнер для сообщений #messages
Настройка ActionCable(backend)
Для работы с ActionCable необходимо создать 2 класса Connection
и Channel
Создадим их в папке app/channels/application_cable
Прописывать channels
в autoloads не нужно, Rails подгрузит их по умолчанию
1 2 3 4 |
|
1 2 3 4 |
|
Настройка Redis
ActionCable использует Redis, добавим конфигурационный файл в config/redis/cable.yml
.
Настройки довольно стандартные для Redis.
1 2 3 4 5 6 7 8 9 |
|
Так как ActionCable использует отдельный процесс, то создадим rackup файл с конфигурацией cable/config.ru
1 2 3 4 5 6 |
|
Для удобства запуска нашего ActionCable сервера, давайте добавим sh скрипт в папку bin
и назовем его cable
1 2 |
|
Не забываем поставить этому файлу права на исполнение chmod +x bin/cable
Теперь создадим MessagesChannel
, ответственный за подписку на стрим
1 2 3 4 5 |
|
Далее изменим наш action create
в MessagesController, добавим функционал по отсылке сообщений
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Настройка client-side
Создадим папку channels
в app/assets/javascripts
.
Сначала необходимо создать соединение с нашим ActionCable сервером, создаем index.coffee
1 2 3 4 5 6 |
|
Теперь подпишемся на MessagesChannel
, создаем messages.coffee
1 2 3 4 5 6 |
|
Здесь в функции received
мы получаем данные и вставляем отрендеренные сообщения в #messages
контейнер
Теперь добавим наш js(//= require channels
) в application.js
1 2 3 4 5 |
|
Наш чат готов!
Запускаем наше rails приложение rails s
, потом запускаем ./bin/cable
. Открываем либо два браузера, либо
запускаем вкладку в режиме инкогнито, переходим на http://localhost:3000 и проверяем работу чата.