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 и проверяем работу чата.