Rails 3 API XML Builder / Twilio
-
28-09-2019 - |
Question
Cette API Twilio Exemple de code ne fonctionne pas dans 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
Toutes les idées?
Twilio semble faire avec succès l'appel téléphonique (je peux voir les params avec mon numéro de téléphone, l'emplacement, etc.) mais retourner ce code de réponse vague:
Completed 406 Not Acceptable in 0ms
La solution
Twilio n'envoie pas un en-tête Accept HTTP dans ses demandes qui Les causes Rails 3 de décider qu'il ne peut pas répondre à un type de contenu approprié. Je pense que ce qui suit va se déplacer pour vous si:
# voice_controller.rb def reminder @postto = BASE_URL + '/directions' render :content_type => 'application/xml' end
Autres conseils
employé Twilio ici. Il y a eu un tas de changements à Rails depuis cette question originale a été publiée, et je voulais partager comment vous pouvez résoudre ce problème en utilisant Rails 4, préoccupations et le joyau Ruby Twilio.
Dans l'exemple de code ci-dessous, je définir le contrôleur /controllers/voice_controller.rb
et comprennent une préoccupation appelée Webhookable. La préoccupation Webhookable nous permet de logique encapsulent liée à Twilio webhooks (réglage l'en-tête de réponse HTTP au texte / xml, rendu TwiML, valider que les demandes proviennent de Twilio, etc.) en un seul module.
require 'twilio-ruby'
class VoiceController < ApplicationController
include Webhookable
after_filter :set_header
# controller code here
end
La préoccupation se vit dans /controllers/concerns/webhookable.rb
et est assez simple. En ce moment, il définit simplement le type de contenu text / xml pour toute action et fournit une méthode pour rendre l'objet TwiML. Je n'ai pas inclus le code pour valider que les demandes sont originaires de Twilio, mais ce serait facile d'ajouter:
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
Enfin, voici ce que votre action reminder
pourrait ressembler à l'aide de la gemme Twilio pour générer TwiML et en utilisant le souci de rendre cet objet sous forme de texte:
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