Подтвердить что ты не робот

Ruby - создание файла в памяти

Есть ли вообще-нибудь написать следующий код в Ruby, не записывая файл на диск?

temp_file = 'path/to/file.csv'
users = [[email protected], [email protected]]

CSV.open(temp_file, "w") do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file

File.delete(temp_file)

Report.sendreport присоединяет файл и отправляет электронное письмо, поэтому он должен быть файлом...

4b9b3361

Ответ 1

Попробуйте один из камней mmap. Если библиотека принимает только имя файла, это ваш вариант.

Если он может принимать файл-подобный объект, однако, вы можете использовать StringIO.

Вы можете рассмотреть возможность изменения любого Reports, что делает его более универсальным. Это зависит от того, что он использует для создания своего почтового сообщения. Это может быть тривиально.

Ответ 2

Вы можете использовать Tempfile. Tempfile записывает файл на диск, поэтому он не соответствует вашему запросу.

Но я думаю, что Tempfile предоставляет некоторые функции, которые вам нужны:

Когда объект Tempfile собирает мусор или когда интерпретатор Ruby выходит, связанный с ним временный файл автоматически удаляется.

Пример:

require 'tempfile'
require 'csv'

data_for_report = [1,2,3,4]
temp_file = Tempfile.new('foo')

CSV.open(temp_file, "w") do |csv|
  csv << data_for_report
end

Ответ 3

С вашим текущим кодом это невозможно, если вместо этого код использует указатели/дескрипторы файлов, вы можете сделать следующее:

require 'csv'
require 'stringio'

data_for_report = [1,2,3,4]
temp_file = StringIO.new # creates a fake file as string.

CSV.new(temp_file, "w") do |csv|
  csv << data_for_report
end

Ключевая проблема, почему он не работает для вашего сценария использования, - строка Reports.report users temp_file

Если он принимает дескриптор вместо строки, он будет работать.

Смотрите также это ТАК: fooobar.com/questions/1504917/...

Ответ 4

temp_file = CSV.generate do |csv|
  csv << data_for_report
end

Reports.sendreport users temp_file