Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 如何处理file_as_string(由Prawn生成),以便Carrierwave接受?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Prawn从Rails应用程序的控制器生成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.

工人看起来像这样

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包含空字节

fileString = StringIO.new(pdf.render_file’filename’)返回TypeError:否将nil隐式转换为String

fileString = StringIO.new(pdf.render)返回ActiveRecord :: RecordInvalid:验证失败:文件您不能上传无文件,允许的类型:jpg,jpeg,gif,png,pdf,doc,docx,xl​​s,xLSX

fileString = File.open(pdf.render)返回ArgumentError:String包含空字节

….等等.

我失踪了什么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接受?全部内容,希望文章能够帮你解决ruby-on-rails – 如何处理file_as_string(由Prawn生成),以便Carrierwave接受?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。