web-dev-qa-db-ja.com

Rails 5.2 ActiveStorageを使用してPDFを作成および保存し、後で電子メールに添付します

新しいアクティブストレージ機能で何か問題が発生しているのではないかと心配しています。私がやりたいのは、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 }

パート1はまだありません。誰かが答えを持っていることを願っています!

19
Markus Andreas

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で使用できます。

次に、更新された質問で述べたように、ファイルをダウンロードしてメールに添付できます。

21
Derek Hopper