2016-02-27 2 views
2

У меня очень простое приложение Sinatra, которое позволяет получать SMS-сообщения через мой номер Twilio и печатать их на том же сеансе терминала, на котором работает приложение. Я хотел бы сохранить эти сообщения в локальном CSV-файле. Добавление CSV.open() к приложению вызывает некоторые ошибки.Sinatra - Saving Twilio SMS to 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 вне метода пост, но это только пишет , , в файл каждый раз, когда я начинаю applicaiton.

Каков правильный способ сохранить эту информацию в файле 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