3

私は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内側に を挿入する方法は?InvoicePdfInvoicePdfInvoiceMailer

編集:これは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
4

1 に答える 1