Rails 3 XML Builder / Twilio API
-
28-09-2019 - |
Вопрос
Этот пример кода Twilio API не работает в Rails 3:
#voice_controller.rb
def reminder
@postto = BASE_URL + '/directions'
respond_to do |format|
format.xml { @postto }
end
end
#reminder.xml.builder
xml.instruct!
xml.Response do
xml.Gather(:action => @postto, :numDigits => 1) do
xml.Say "Hello this is a call from Twilio. You have an appointment
tomorrow at 9 AM."
xml.Say "Please press 1 to repeat this menu. Press 2 for directions.
Or press 3 if you are done."
end
end
Есть идеи?
Кажется, что Twilio, кажется, успешно создает телефонный звонок (я вижу параметры с моим номером телефона, местоположением и т. Д.) Но затем вернуть этот распадную код ответа:
Completed 406 Not Acceptable in 0ms
Решение
Twilio не отправляет принять заголовок HTTP в его просьбы, который вызывает рельсы 3, чтобы решить, что он не может ответить с соответствующим типом контента. Я думаю, что следующее обойдут это для вас, хотя:
# Voice_controller.rb def напоминание @postto = base_url + '/ направления' Render: content_type => 'application / xml'
Другие советы
Сотрудник Twilio здесь. Там был куча изменений в рельсах, поскольку этот оригинальный вопрос был опубликован, и я хотел поделиться тем, как вы можете решить эту проблему, используя Rails 4, проблемы и Twilio Ruby Gem.
В образце кода ниже я определяю контроллер в /controllers/voice_controller.rb
и включить беспокойство под названием WebHookable. WebHookable Concerge позволяет нам инкапсулировать логику, связанную с WebHooks Twilio (установка заголовка отклика HTTP для текста / XML, рендеринг Twiml, подтверждающий, что запросы возникают из Twilio и т. Д.) в один модуль.
require 'twilio-ruby'
class VoiceController < ApplicationController
include Webhookable
after_filter :set_header
# controller code here
end
Сама забота живет в /controllers/concerns/webhookable.rb
и довольно просто. Прямо сейчас он просто устанавливает тип Content в 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 и использование концерна для рендеринга этого объекта в виде текста:
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