Ruby on rails WickedPDF生成的PDF文件与Shiele一起上载不会填充数据字段

Ruby on rails WickedPDF生成的PDF文件与Shiele一起上载不会填充数据字段,ruby-on-rails,ruby-on-rails-5.2,shrine,Ruby On Rails,Ruby On Rails 5.2,Shrine,我正在从回形针迁移我的整个上传过程,并且在生成PDF时遇到了一个问题 处理上载的子模型是名为quotepdf 在某个点上,会生成一个quotepdf实例,并将一个附件链接到该实例 这是适用于神社的quotepdf模型 class Quotepdf < ApplicationRecord include QuotesAndInvoicesUploader::Attachment.new(:quote) belongs_to :quotable, polymorphic: tr

我正在从回形针迁移我的整个上传过程,并且在生成PDF时遇到了一个问题

处理上载的子模型是名为
quotepdf

在某个点上,会生成一个
quotepdf
实例,并将一个附件链接到该实例

这是适用于神社的quotepdf模型

class Quotepdf < ApplicationRecord
  include QuotesAndInvoicesUploader::Attachment.new(:quote)    
  belongs_to :quotable, polymorphic: true

end
用回形针,它过去工作得很好。虽然使用了Shieline,但没有任何内容保存到新“quotepdf”记录的“quote”数据列中。 工人也没有返回任何错误

缓存的文件确实被上传到S3 bucket,所以PDF文件被正确地生成。缺少最终文件

编辑

通过将我的上传程序剥离到裸机,使其正常工作:

class QuotesAndInvoicesUploader < Shrine

    def generate_location(io, context)
        type  = context[:record].class.name.downcase if context[:record]
        name  = super 

        [type, name].compact.join("/")
    end

end

虽然我的intialiser有
神龛。plugin:在后台工作中确定\u mime\u类型

,但请尝试查看此输出:

Shrine.determine_mime_type(StringIO.new(pdf_string))
如果它是
nil
,那么我建议尝试不同的分析器(例如
:mimemagic
:marcel

如果失败,您还可以使用基于扩展名的分析器,例如
:mime\u types
:mini\u mime
,并在后台作业中分配一个带有扩展名的临时文件:

tempfile = Tempfile.new(["quote", ".pdf"], binmode: true)
tempfile.write pdf_string
tempfile.open # flush & rewind

new_pdf = @quote.build_quotepdf
new_pdf.quote = tempfile
new_pdf.save! # fail loudly if save fails
或者,由于您是在后台作业中进行连接,因此可以简单地避免临时存储和验证:

pdf_file = StringIO.new(pdf_string)
uploaded_file = new_pdf.quote_attacher.store!(pdf_file)
new_pdf.quote_data = uploaded_file.to_json
new_pdf.save!

在您的后台工作中,尝试查看此输出:

Shrine.determine_mime_type(StringIO.new(pdf_string))
如果它是
nil
,那么我建议尝试不同的分析器(例如
:mimemagic
:marcel

如果失败,您还可以使用基于扩展名的分析器,例如
:mime\u types
:mini\u mime
,并在后台作业中分配一个带有扩展名的临时文件:

tempfile = Tempfile.new(["quote", ".pdf"], binmode: true)
tempfile.write pdf_string
tempfile.open # flush & rewind

new_pdf = @quote.build_quotepdf
new_pdf.quote = tempfile
new_pdf.save! # fail loudly if save fails
或者,由于您是在后台作业中进行连接,因此可以简单地避免临时存储和验证:

pdf_file = StringIO.new(pdf_string)
uploaded_file = new_pdf.quote_attacher.store!(pdf_file)
new_pdf.quote_data = uploaded_file.to_json
new_pdf.save!

非常感谢Janko。实际上<代码>神龛。确定mime类型(StringIO.new(pdf字符串))实际返回<代码>应用程序/pdf。所以不太清楚验证失败的原因。但是,您的正确验证实际上并不需要。我用你的解决方案绕过了缓存文件。填充的元数据确实显示了正确的mime类型(转义)。文件名仍然需要手动填充。但是都很好,非常感谢Janko。实际上<代码>神龛。确定mime类型(StringIO.new(pdf字符串))实际返回<代码>应用程序/pdf。所以不太清楚验证失败的原因。但是,您的正确验证实际上并不需要。我用你的解决方案绕过了缓存文件。填充的元数据确实显示了正确的mime类型(转义)。文件名仍然需要手动填充。但一切都很好。
pdf_file = StringIO.new(pdf_string)
uploaded_file = new_pdf.quote_attacher.store!(pdf_file)
new_pdf.quote_data = uploaded_file.to_json
new_pdf.save!