Я использую Prawn для создания PDF файла из контроллера приложения Rails,
...
respond_to do |format|
format.pdf do
pdf = GenerateReportPdf.new(@object, view_context)
send_data pdf.render, filename: "Report", type: "application/pdf", disposition: "inline"
end
end
Это отлично работает, но теперь я хочу переместить GenerateReportPdf в фоновое задание и передать результирующий объект Carrierwave для прямой загрузки на S3.
Рабочий выглядит так:
def perform
pdf = GenerateReportPdf.new(@object)
fileString = ???????
document = Document.new(
object_id: @object.id,
file: fileString )
# file is field used by Carrierwave
end
Как обработать объект, возвращенный Prawn (?????
), чтобы убедиться, что это формат, который может быть прочитан Carrierwave.
fileString = pdf.render_file 'filename'
записывает объект в корневую директорию приложения. Поскольку я на Хереку, это невозможно.
file = pdf.render
возвращает ArgumentError: string contains null byte
fileString = StringIO.new( pdf.render_file 'filename' )
возвращает TypeError: no implicit conversion of nil into String
fileString = StringIO.new( pdf.render )
возвращает ActiveRecord::RecordInvalid: Validation failed: File You are not allowed to upload nil files, allowed types: jpg, jpeg, gif, png, pdf, doc, docx, xls, xlsx
fileString = File.open( pdf.render )
возвращает ArgumentError: string contains null byte
.... и т.д.
Что мне не хватает? StringIO.new( pdf.render )
кажется, что он должен работать, но я не понимаю, почему он порождает эту ошибку.