2010-10-06 6 views
1

Cette API Twilio Exemple de code ne fonctionne pas dans Rails 3:Rails 3 Générateur XML/API Twilio

#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 réussir à faire l'appel téléphonique (je peux voir les params avec mon numéro de téléphone, l'emplacement, etc.) mais renvoyer ce code de réponse vague:

Completed 406 Not Acceptable in 0ms 
+0

Où mettez-vous le fichier de constructeur XML ??? –

Répondre

2

Twilio n'envoie pas accept En-tête HTTP dans its requests, ce qui oblige Rails 3 à décider qu'il ne peut pas répondre avec un type de contenu approprié. Je pense que ce qui suit va contourner cela pour vous:

 
# voice_controller.rb 

    def reminder 
    @postto = BASE_URL + '/directions' 

    render :content_type => 'application/xml' 
    end 
+0

légère modification:: content_type au lieu de: content-type –

3

Employé de Twilio ici. Il y a eu un tas de changements à Rails depuis que cette question originale a été postée, et je voulais partager comment vous pourriez aborder ce problème en utilisant Rails 4, Concerns et la gemme Twilio Ruby.

Dans l'exemple de code ci-dessous, je définis le contrôleur dans /controllers/voice_controller.rb et inclu un problème appelé Webhookable. Le Webhookable Concern nous permet d'encapsuler la logique liée aux webhooks de Twilio (en définissant l'en-tête de réponse HTTP à text/xml, en rendant TwiML, en validant que les requêtes proviennent de Twilio, etc.) dans un seul module.

require 'twilio-ruby' 

class VoiceController < ApplicationController 
    include Webhookable 

    after_filter :set_header 

    # controller code here 

end 

L'inquiétude se vit dans /controllers/concerns/webhookable.rb et est assez simple. À l'heure actuelle, il définit simplement Content-Type sur text/xml pour toutes les actions 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 comme 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