私はActiveJob
メールを送信するために使用しています:
使用deliver_now
方法:
請求書_controller.rb
def send_invoice
#other stuff
Members::InvoicesMailer.send_invoice(@invoice.id, view_context).deliver_now
end
請求書_メーラー.rb
require 'open-uri'
class Members::InvoicesMailer < ApplicationMailer
def send_invoice(invoice_id, view_context)
@invoice = Invoice.find(invoice_id)
attachments["#{@invoice.identifier}.pdf"] = InvoicePdf.new(@invoice, view_context).render
mail :to => @invoice.client.email, :subject => "Invoice"
end
end
view_context
ここで、コントローラーからメーラーに を送信していることに注意してください。メーラーは、再びそれをInvoicePdf
クラスに渡して請求書を生成します。
結果:メールは正しく送信されました
使用deliver_later
方法:
請求書_controller.rb
def send_invoice
#other stuff
Members::InvoicesMailer.send_invoice(@invoice.id, view_context).deliver_later
end
結果: ActiveJob::SerializationError in Members::InvoicesController#send_invoice Unsupported argument type:
view_context
。
の内側からロードするか、またはのview_context
内側に を挿入する方法は?InvoicePdf
InvoicePdf
InvoiceMailer
編集:これはInvoicePdfがどのように見えるかです
請求書_pdf.rb
class InvoicePdf < Prawn::Document
def initialize(invoice, view_context)
@invoice, @view_context = invoice, view_context
generate_pdf
end
def generate_pdf
# calling some active_support helpers:
# @view_context.number_to_currency(//)
# calling some helpers I created
end
end