ruby-on-rails - 如何处理 file_as_string(由 Prawn 生成)以便 Carrierwave 接受它?

标签 ruby-on-rails carrierwave prawn

我正在使用 Prawn 从 Rails 应用程序的 Controller 生成 PDF,

...
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。

worker 看起来像这样
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'将对象写入应用程序的根目录。由于我在 Heroku,这是不可能的。
file = pdf.render返回 ArgumentError: string contains null bytefileString = StringIO.new( pdf.render_file 'filename' )返回 TypeError: no implicit conversion of nil into StringfileString = 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, xlsxfileString = File.open( pdf.render )返回 ArgumentError: string contains null byte
....等等。

我错过了什么? StringIO.new( pdf.render )看起来它应该可以工作,但我不清楚为什么会产生这个错误。

最佳答案

原来StringIO.new( pdf.render )确实应该工作。

我遇到的问题是文件名设置不正确,尽管遵循以下 Carrierwave wiki 上的建议,但代码中其他地方的错误意味着文件名作为空字符串返回。我忽略了这一点,认为还需要其他东西

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Upload-from-a-string-in-Rails-3

我的代码最终看起来像这样

def perform
  s = StringIO.new(pdf.render)

  def s.original_filename; "my file name"; end

  document  = Document.new(
    object_id: @object.id
  )

  document.file = s

  document.save!
end

关于ruby-on-rails - 如何处理 file_as_string(由 Prawn 生成)以便 Carrierwave 接受它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31487710/

相关文章:

ruby-on-rails - 有没有办法在不加载的情况下序列化 ActiveRecord Relation 对象?

ruby-on-rails - Ruby on Rails 中的 ActiveAdmin 未初始化常量

ruby-on-rails - carrierwave 不在 uploader 上保存 content_type

ruby - 准备用作 Prawn 模板的 PDF

mysql - 你能用rails中的正则表达式进行where查找吗?

ruby-on-rails - 如何在阻止 sudo 的 Linux 发行版上安装 RoR?

ruby-on-rails - 载波程序化上传

ruby-on-rails - Carrierwave:在非ActiveRecord继承类中挂载Uploader

ruby-on-rails - Prawn 表 : Block is not executing

ruby - Prawn 模板不起作用