Rails 3 XML Builder / Twilio API - PullRequest
       9

Rails 3 XML Builder / Twilio API

1 голос
/ 07 октября 2010

Этот пример кода 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

Ответы [ 2 ]

3 голосов
/ 14 января 2014

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

В приведенном ниже примере кодаЯ определяю контроллер в /controllers/voice_controller.rb и включаю Концерн под названием 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
2 голосов
/ 07 октября 2010

Twilio не отправляет HTTP-заголовок Accept в своих запросах , что заставляет Rails 3 решить, что он не может ответить с соответствующим типом контента. Я думаю, что следующее обойдется для вас, хотя:

# voice_controller.rb

  def reminder
    @postto = BASE_URL + '/directions'

    render :content_type => 'application/xml'
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...