21

恐怕我对新的主动存储功能完全错误。我想要做的是创建一个 pdf (我正在使用 WickedPdf )并将其附加到模型上。这是第一个问题,到目前为止我发现的唯一机会是先写入文件,然后打开该文件以创建附件。

self.document.attach( {
  filename: "filename.pdf",
  io: File.open(pdf_document)
})

有没有办法从字符串创建附件?

之后我尝试将此文件附加到邮件中。这失败了,因为它再次需要一个文件,而不是一个 blob。

attachments[document.filename.to_s] = document.blob

再次创建文件对我来说真的很奇怪。

可以请有人告诉我什么是在根本不编写文件的情况下实现这一目标的正确方法吗?对我来说,我似乎没有必要、效率低下和费时。

=====

解决方案第 2 部分:所以我设法在不创建文件的情况下附加文档

attachments[document.filename.to_s] = {:mime_type => 'application/pdf',
                               :content => document.attachment.blob.download }

第一部分仍然缺失。希望有人能解答!

4

1 回答 1

28

我相信,如果您要生成 PDF 之类的内容,您会希望io在附加时使用该选项。这就是我现在在应用程序中做事的方式。

例如,这是文档显示的内容

person.avatar.attach(params[:avatar]) # ActionDispatch::Http::UploadedFile object
person.avatar.attach(params[:signed_blob_id]) # Signed reference to blob from direct upload
person.avatar.attach(io: File.open("/path/to/face.jpg"), filename: "face.jpg", content_type: "image/jpg")
person.avatar.attach(avatar_blob) # ActiveStorage::Blob object

如文档中所示,除非您有 ,否则您ActionDispatch::Http::UploadedFile将需要使用该io选项。

至于将文件附加到电子邮件,您可能有几个选择。如果您仍然可以访问 ,则pdf_document可以执行此操作。我不确定它到底是什么类型的对象。

attachments[document.filename.to_s] = pdf_document.read

更新

我以前使用过 wicked_pdf,但暂时没有。除非您请求文件,否则大多数生成方法似乎都返回一个字符串。您可能已经知道这一点 - 只是为答案提供一些背景。

由于 wicked_pdf 可以返回一个字符串,我认为您可以使用StringIO附加文件。例如:

pdf = WickedPdf.new.pdf_from_string("<h1>Hey</h1>")
self.document.attach(io: StringIO.new(pdf), filename: "file.pdf", content_type: "application/pdf")

StringIO 完全顾名思义。它接受一个字符串并使其表现为 IO。一旦你有了一个 IO,你就可以将它与 ActiveStorage 一起使用,就像你有一个打开的文件一样。

然后,正如您在更新的问题中提到的,您可以下载文件并将其附加到电子邮件中。

于 2018-01-15T23:49:26.020 回答