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 присоединяет файл и отправляет электронное письмо, поэтому он должен быть файлом...
Ответы
Ответ 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