Когда я начал работать над проектом со своим коллегой, нам не потребовалось много времени, чтобы решить, что мы хотим создать. Мы сразу же подумали о создании приложения для чата и подумали, что разобраться в нем не так уж и сложно. Конечно, у нас было всего два дня, но, может быть, это будет тот огонь, который нам нужен, чтобы создать что-то действительно потрясающее! Единственная проблема заключалась в том, что везде, где мы смотрели, только перечисленные примеры использования ActionCable с полным стеком Ruby on Rails, и мы использовали его только для Backend Rails API.

Шаг 1. Настройте базу данных, сериализаторы и внесите свой API в белый список (CORS)

Чтобы ваш Frontend мог взаимодействовать с вашим Backend с помощью JavaScript, вам потребуется настроить базу данных и сериализовать данные. Причина, по которой это важно, заключается в том, что это позволит вашему Frontend взаимодействовать с вашим Rails API через Websockets. Без него это НЕ будет работать.

В разделе config ›initializers› cors.rb укажите в белом списке веб-сайты, которым вы хотите разрешить доступ к вашему API:

А затем внесите его в белый список в config ›environment› development.rb следующим образом:

Шаг 2: Подключите ActionCable и создайте Websocket

После того, как вы убедились, что ваши данные доступны на локальном хосте, пора создать доступный веб-узел. Перейдите в config ›routes.rb и подключите ActionCable:

Как только это будет настроено, перейдите к своему Frontend и создайте функцию для открытия нового Websocket, который взаимодействует с смонтированным ActionCable:

Шаг 3. Создайте канал

В разделе приложение ›каналы создайте канал для информации, которую вы пытаетесь транслировать и обрабатывать. В этом случае мы пытаемся передавать сообщения чата между пользователями (анонимными и вошедшими) на канал (Users has_many Messages on a Channel). Здесь принимаются и обрабатываются сообщения от Frontend:

В приведенном выше примере метод подписанный вызывает метод self.all_messages внутри ChatMessagesChannel. Это означает, что пользователь (анонимный или вошедший в систему) подписывается на текущую «трансляцию» после открытия веб-страницы. Эта трансляция - это то, как информация передается в прямом эфире всем, кто в настоящее время может быть подписан на тот же канал (например, пользователям в чате).

Шаг 4: общайтесь с серверной частью через WebSocket

Пришло время собрать все воедино! Вернитесь во внешний интерфейс и создайте функцию, которая будет подписывать анонимного или вошедшего в систему пользователя на любого и все сообщения, которые будут получены в режиме реального времени после загрузки страницы:

Мы вызываем созданную ранее функцию openConnection и добавляем прослушиватель событий onopen в chatWebSocket. Это событие немедленно подписывается на канал сообщений чата. Давайте разберемся еще дальше:

В объекте subscribeMsg вы видите «command»: «subscribe» - вам это кажется знакомым? Он вызывает метод, который мы создали ранее в канале сообщений чата. Однако как узнать, что это правильный канал? Давайте посмотрим на следующую часть: «идентификатор»: «{\» канал \ »: \« ChatMessagesChannel \ »}» - как вы можете видеть по значению идентификатора, он специально ищет канал под названием ChatMessagesChannel.

Вот и все!

Теперь все, что осталось, - это доработать ваше приложение и реализовать способ анализа данных вашего сообщения и их рендеринга в реальном времени. Однако теперь любой на вашей странице может получать ЛЮБЫЕ новые сообщения, которые отправляются, а затем транслируются из канала сообщений чата.

Если вы действительно заинтересованы в развертывании серверной части ActionCable Rails API в Heroku, посетите блог моего коллеги, который подробно описывает установку здесь.