Сотрудник Twilio здесь. С тех пор, как был опубликован этот исходный вопрос, в Rails было внесено множество изменений, и я хотел поделиться тем, как вы можете решить эту проблему с помощью Rails 4, Concerns и драгоценного камня Twilio Ruby.
В приведенном ниже примере кода я определяю контроллер в /controllers/voice_controller.rb
и включаю Concern с именем Webhookable. Проблема Webhookable позволяет нам инкапсулировать логику, связанную с веб-перехватчиками Twilio (установка заголовка ответа HTTP в text/xml, рендеринг TwiML, проверка того, что запросы исходят из Twilio и т. д.) в один модуль.
require 'twilio-ruby'
class VoiceController < ApplicationController
include Webhookable
after_filter :set_header
# controller code here
end
Сам Концерн живет в /controllers/concerns/webhookable.rb
и довольно прост. Прямо сейчас он просто устанавливает для Content-Type значение text/xml для всех действий и предоставляет метод для рендеринга объекта TwiML. Я не включил код для проверки того, что запросы исходят из Twilio, но его было бы легко добавить:
module Webhookable
extend ActiveSupport::Concern
def set_header
response.headers["Content-Type"] = "text/xml"
end
def render_twiml(response)
render text: response.text
end
end
Наконец, вот как может выглядеть ваше действие reminder
с использованием гема Twilio для создания TwiML и использования Concern для отображения этого объекта в виде текста:
def reminder
response = Twilio::TwiML::Response.new do |r|
r.Gather :action => BASE_URL + '/directions', :numDigits => 1 do |g|
g.Say 'Hello this is a call from Twilio. You have an appointment
tomorrow at 9 AM.'
g.Say 'Please press 1 to repeat this menu. Press 2 for directions.
Or press 3 if you are done.'
end
end
render_twiml response
end
person
Carter Rabasa
schedule
13.01.2014