Rails 3 XML Builder / Twilio API
-
28-09-2019 - |
Frage
Dieses Twilio API Beispielcode funktioniert nicht in 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
Irgendwelche Ideen?
Twilio scheint erfolgreich den Anruf zu tätigen (Ich kann die params sehe mit meiner Telefonnummer, Standort, etc.), aber dann wieder diesen vageen Antwort-Code:
Completed 406 Not Acceptable in 0ms
Lösung
Twilio nicht ein HTTP-Header in Accept schicken ihre Anfragen , die 3 bewirkt, dass Rails zu entscheiden, dass es nicht kann reagieren mit einem entsprechenden Inhaltstyp. Ich denke, die folgende umgehen wird, dass für Sie aber:
# voice_controller.rb def reminder @postto = BASE_URL + '/directions' render :content_type => 'application/xml' end
Andere Tipps
Twilio Mitarbeiter hier. Es gibt eine Reihe von Änderungen an Rails, seit dieser ursprüngliche Frage gestellt wurde, und ich wollte teilen, wie Sie dieses Problem mit angehen könnten Rails 4, Bedenken und die Twilio Rubin gem.
In dem Codebeispiel unten definiere ich den Controller in /controllers/voice_controller.rb
und umfassen eine Sorge genannt Webhookable. Die Webhookable Concern läßt uns encapsulate Logik im Zusammenhang mit Twilio webhooks (Einstellung des HTTP-Antwort-Header text / xml, Rendering TwiML, Validieren, dass Anfragen von Twilio stammen, usw.) in ein einziges Modul.
require 'twilio-ruby'
class VoiceController < ApplicationController
include Webhookable
after_filter :set_header
# controller code here
end
Die Sorge selbst lebt in /controllers/concerns/webhookable.rb
und ist ziemlich einfach. Im Moment setzt er einfach den Content-Type auf text / xml für alle Aktion und stellt eine Methode, um das TwiML Objekt zu machen. Ich habe nicht enthalten den Code zu bestätigen, dass Anfragen Ursprung sind von Twilio, aber das wäre einfach hinzufügen:
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
Schließlich ist hier, was Ihre reminder
Aktion aussehen könnte das Twilio Juwel wie mit TwiML und mit der Sorge zu erzeugen, dieses Objekt als Text zu machen:
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