2010-10-06 69 views
1

這Twilio API示例代碼是不是在Rails 3的工作:Rails 3的XML生成器/ Twilio API

#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似乎已成功打來電話(我可以看到PARAMS有我的電話號碼,位置等),但然後返回這個模糊的響應代碼:

Completed 406 Not Acceptable in 0ms 
+0

你把XML生成器文件放在哪裏? – 2011-06-06 20:46:10

回答

2

Twilio不發送接受HTTP頭在its requests,這導致Rails 3決定它不能用適當的內容類型進行響應。我認爲以下將爲您解決:

 
# voice_controller.rb 

    def reminder 
    @postto = BASE_URL + '/directions' 

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

輕微編輯::content_type而不是:content-type – 2012-01-23 07:36:36

3

Twilio員工在這裏。自從這個原始問題發佈以來,Rails已經發生了一系列變化,我想分享如何使用Rails 4,Concerns和Twilio Ruby gem來解決這個問題。

在下面的代碼示例中,我定義了/controllers/voice_controller.rb中的控制器,幷包含一個名爲Webhookable的關注。 Webhookable Concern讓我們封裝與Twilio webhooks相關的邏輯(將HTTP響應頭文件設置爲text/xml,呈現TwiML,驗證來自Twilio的請求等)到單個模塊中。

require 'twilio-ruby' 

class VoiceController < ApplicationController 
    include Webhookable 

    after_filter :set_header 

    # controller code here 

end 

The Concern本身住在/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和使用將此對象設置爲文本的關注點:

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