実現したいこと
sidekiqを用いて、ActionMailerから、PDFファイルを添付してメールを送信をしたいと思っております。
Pdfクラスを用いてメール送信した場合はメール送信に成功します。
Pdfクラスを継承したMultiPdfインスタンスを用いてメールを送信した場合にActiveJob::Arguments#deserializeにてエラーが発生してしまいます。
この事象について
調べてみるとActiveJobに対してActiveRecordインスタンスを渡すとシリアライズされずに、Global IDというURIに変換されるようです。
デバッグしてみると、以下のようなGlobalIDが引数で渡されていました。
{"_aj_globalid"=>"gid://myapp/MultiPdf/hoge"}, ["fuga@example.com", "", "", "", ""]
PdfクラスのインスタンスはActiveRecordインスタンスで、DBにpdfsテーブルが存在します。
MultiPdfクラスはPdfクラスを継承しているので、ActiveRecordを親に持ちますが、DBにテーブルは存在しません。
上記の場合についてMultiPdfインスタンスでメールを送信する場合の方法や対応策についてご教授願います。
エラー内容
- sidekiqのエラー内容
ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find MultiPdf with 'id'=hoge
該当のソースコード
DBにpfdテーブルがあり、以下のpdfはActiveRecordインスタンスモデルです。
1 class Pdf < ActiveRecord::Base 2# Table name: pdfs 3# 4# id :integer not null, primary key 5# status :integer default(0) 6# created_at :datetime not null 7# updated_at :datetime not null 8# deleted_at :datetime 9... 10 11...以降メソッドなど色々 12end
上記のPdfクラスを継承したMultiPdfクラスがあります。
multipdf
1class MultiPdf < Pdf 2 def id 3 self.class.id 4 end 5 6 def title 7 'マルチPDF' 8 end 9 ... 10end
pdfscontroller
1class ProposalsController < ApplicationController 2 ... 3 def mail 4 email = 'fuga@example.com' 5 6 if @form.valid? 7 EmailMailer.pdf(@pdf, email).deliver_later! 8 9 redirect_to home_path 10 else 11 flash[:alert] = @form.errors.full_messages 12 end 13 end 14end
emailmailer
1class EmailMailer < ApplicationMailer 2 def pdf(@pdf, email) 3 @pdf = pdf 4 5 attachments[@pdf.decorate.title] = WickedPdf.new.pdf_from_string( 6 render_to_string( 7 template: 'pdf/show.pdf', 8 format: 'pdf', 9 pdf: @pdf.title, 10 encoding: 'utf-8', 11 layout: 'hoge_pdf.html.haml' 12 ) 13 ) 14 15 mail( 16 to: email, 17 subject: "hogehoge" 18 ) 19 end 20 ... 21end

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/06 02:02