Twilio и Rails 3: Отслеживание SMS-диалогов

Автор: | 24.07.2026

*Ниже приведена подробная статья Алекса об отслеживании SMS-диалогов, созданных с помощью Twilio на Rails 3.*

*Он является основателем стартапа Ordext, службы заказа еды через SMS, которая построена на Ruby on Rails и работает на Twilio. Следите за Алексом в Twitter @Meyer_On_Fire и @Ordext.*

Я работал над веб-приложением, которое интегрирует Twilio, и не смог найти необходимую документацию для Rails, чтобы решить проблему, с которой я столкнулся. Ниже приведен помощник для любого разработчика, использующего Twilio с Rails 3 для обоих Twilio SMS и Twilio Voice API.

Пытаясь интегрировать Twilio в моё приложение Rails, я столкнулся с проблемой отслеживания SMS-диалога. Следуя документации Twilio об отслеживании SMS-диалогов, как описано здесь, я пришёл к следующему коду:

Этот код является частью отдельного контроллера, который я создал в своём приложении Rails для обработки Twilio SMS. Он позволяет мне перенаправить диалог, если он уже был начат, или начать диалог с начала. Код также использует переменные сессии, предоставляемые Rails, которые хранят файл cookie на стороне клиента, чтобы вы могли запомнить определённые состояния в приложении.

После написания этого кода я подумал, что всё готово и можно идти дальше. Я поместил этот код на сервер и попытался отправить несколько тестовых сообщений. Начало диалога работало идеально, я смог получить правильные ответы. Однако, когда я отвечал на это сообщение и ожидал, что диалог будет передан на следующий действие в моём контроллере, я получал те же ответы, которые я получил в начале диалога.

Это была проблема. Я знал, что это должно быть переменная сессии, которая не сохраняется, но я не имел представления, почему.

Сначала я подумал, что это из-за того, как Rails сохраняет данные сессии в файлах cookie. Я знал, что Twilio обрабатывает SMS-диалоги с помощью файлов cookie, но, возможно, файлы cookie были несовместимы, и мне нужно было изменить хранение данных сессии в файле cookie на сервере вместо клиента. Однако это не помогло, и переменная сессии всё равно не сохранялась. Другой способ обойти проблему с файлом cookie — создать свой собственный и сохранить всё в созданной таблице базы данных. Это возможно, но очень трудоёмко и не практично.

Искать ответы в Интернете, я наткнулся на Cross Site Reference Forgery и Rails. Руководство по Rails на эту тему можно найти здесь. В Rails, чтобы защититься от CSRF, есть строка кода в контроллере приложения:

Эта строка кода защищает всё приложение от CSRF. Способ, которым она защищает приложение от этого типа атаки, — удаление любых переменных сессии, которые существуют. Это, очевидно, проблема, когда вы пытаетесь использовать переменные сессии.

Вернувшись к моим серверным журналам, я обнаружил, что это была причина, по которой мои переменные сессии не работали. Эта строка появлялась после POST-запроса к моему приложению:

Из-за этого все переменные сессии, которые я создал и попытался сохранить, удалялись каждый раз, когда новое сообщение отправлялось от Twilio к моему приложению Rails.

Я узнал, что есть два способа решить эту проблему, оба простых и прямых. Первый — изменить POST-запросы на GET-запросы. Это можно легко сделать, посетив страницу своего аккаунта Twilio и изменяя меню рядом с URL-адресом SMS с POST на GET. Rails не защищает GET-запросы от CSRF, и поэтому это решит проблему.

Если вы хотите сохранить POST-запросы, то вам нужно убедиться, что Rails не защищает от CSRF в контроллере, который вы используете для приема запросов от Twilio. Для этого требуется всего одна строка кода:

Добавление этой строки кода в контроллер, который вы используете для обработки запросов Twilio, отключит защиту от CSRF только для этого контроллера.

Как только я сделал это в своём контроллере, всё работало идеально и именно так, как я ожидал. Переменные сессии сохранялись так, как они должны были.

Надеюсь, эта статья поможет любым пользователям, которые хотят интегрировать Twilio в свои приложения Rails!