2016-02-27 62 views
2

我有一個非常簡單的Sinatra應用程序,它允許我通過Twilio號碼接收SMS消息,並將它們打印到應用程序正在運行的相同終端會話。我想將這些消息保存到本地.csv文件。嚮應用添加CSV.open()會引發一些錯誤。Sinatra - 將Twilio SMS保存爲CSV

require 'sinatra' 
require 'twilio-ruby' 
require 'csv' 

post '/receive_sms' do 
    @body = params["Body"].to_s 
    @sid = params["MessageSid"].to_s 
    @sender = params["From"].delete('+').to_i 
    content_type 'text/xml' 

    puts @body 
    puts @sender 
    puts @sid 
    CSV.open("/home/ubuntu/Twilio_SMS/smsLog.csv", "a") do |csv| 
     csv << [@sender, @body, @sid] 
    end 
end 

這使我有以下錯誤:

ERROR IOError: closed stream 
     /home/ubuntu/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/body_proxy.rb:16:in `close' 
     /home/ubuntu/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:117:in `ensure in service' 
     /home/ubuntu/.rvm/gems/ruby-2.2.1/gems/rack-1.6.4/lib/rack/handler/webrick.rb:117:in `service' 
     /home/ubuntu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service' 
     /home/ubuntu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run' 
     /home/ubuntu/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread' 

我試圖移動電話CSV POST方法之外,但這只是每次寫入, ,到文件我啓動應用程序了。

將此信息保存到CSV文件的正確方法是什麼?並確保即使快速連續收到每封郵件也會添加該郵件?

回答

5

嘗試向該方法添加有效的返回值。

require 'sinatra' 
require 'twilio-ruby' 
require 'csv' 

post '/receive_sms' do 
    @body = params["Body"].to_s 
    @sid = params["MessageSid"].to_s 
    @sender = params["From"].delete('+').to_i 
    content_type 'text/xml' 

    puts @body 
    puts @sender 
    puts @sid 
    CSV.open("/home/ubuntu/Twilio_SMS/smsLog.csv", "a") do |csv| 
     csv << [@sender, @body, @sid] 
    end 

    'done' 
end 

因爲「CSV.open」是你跑的最後一個方法,西納特拉試圖從中讀取數據生成HTTP應答 - 和試圖從一個封閉的流中讀取調用的IOError

+0

這很好。謝謝。 – atwalsh