Carriles 3 XML Constructor / Twilio API
-
28-09-2019 - |
Pregunta
Este código API Muestra Twilio no está funcionando en 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
¿Alguna idea?
Twilio parece tener éxito la llamada telefónica (Puedo ver los parametros con mi número de teléfono, ubicación, etc.), pero luego devolver este código de respuesta vaga:
Completed 406 Not Acceptable in 0ms
Solución
Twilio no envía una cabecera HTTP Accept en sus peticiones , que causas Rails 3 a decidir que no puede responder con un tipo de contenido apropiado. Creo que el siguiente será conseguir alrededor de eso para usted, aunque:
# voice_controller.rb def reminder @postto = BASE_URL + '/directions' render :content_type => 'application/xml' end
Otros consejos
Twilio aquí. Ha habido un montón de cambios en los carriles ya que esta pregunta original fue publicada, y quería compartir cómo se puede hacer frente a este problema utilizando los carriles 4, Preocupaciones y la gema Twilio Ruby.
En el siguiente ejemplo de código, I definen el controlador en /controllers/voice_controller.rb
e incluyen una preocupación llamado Webhookable. La preocupación Webhookable nos permite encapsular la lógica relacionada con WebHooks Twilio (ajuste de la cabecera de respuesta HTTP para text / xml, lo que hace TwiML, la validación de las solicitudes que se originan a partir Twilio, etc.) en un único módulo.
require 'twilio-ruby'
class VoiceController < ApplicationController
include Webhookable
after_filter :set_header
# controller code here
end
La preocupación en sí vive en /controllers/concerns/webhookable.rb
y es bastante simple. En este momento es simplemente establece el tipo de contenido de texto / xml para toda la acción y proporciona un método para representar el objeto TwiML. No he incluido el código para validar que las solicitudes son procedentes de Twilio, pero eso sería fácil de añadir:
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
Finalmente, esto es lo que su acción reminder
puede tener un aspecto como el uso de la gema Twilio para generar TwiML y utilizando la preocupación de hacer este objeto como texto:
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