Sinatra - 将Twilio SMS保存为CSV

时间:2016-02-27 05:54:10

标签: ruby csv sinatra twilio

我有一个非常简单的Sinatra应用程序,允许我通过我的Twilio号码接收短信,并将它们打印到应用程序运行的同一个终端会话。我想将这些消息保存到本地.csv文件。将CSV.open()添加到应用程序会引发一些错误。

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'

我尝试在post方法之外移动CSV调用,但每次启动应用程序时,这只会将, ,写入文件。

将此信息保存到CSV文件的正确方法是什么,并确保即使快速连续收到每封邮件也会添加?

1 个答案:

答案 0 :(得分: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'是您运行的最后一个方法,所以Sinatra尝试从中读取以生成HTTP回复 - 并尝试从封闭流中读取IOError