在ActionMailer中使用Rails 3 Render Prawn pdf

时间:2012-02-27 15:55:37

标签: ruby-on-rails actionmailer prawn

如何在ActionMailer中将prawn pdf渲染为附件?我使用delayed_job并且不明白,我怎样才能在动作邮件中呈现pdf文件(不在控制器中)。我应该使用什么格式?

3 个答案:

答案 0 :(得分:7)

您只需要告诉Prawn将PDF呈现为字符串,然后将其添加为电子邮件的附件。有关附件的详细信息,请参阅ActionMailer docs

以下是一个例子:

class ReportPdf
  def initialize(report)
    @report = report
  end

  def render
    doc = Prawn::Document.new

    # Draw some stuff...
    doc.draw_text @report.title, :at => [100, 100], :size => 32

    # Return the PDF, rendered to a string
    doc.render
  end
end

class MyPdfMailer < ActionMailer::Base
  def report(report_id, recipient_email)
    report = Report.find(report_id)

    report_pdf_view = ReportPdf.new(report)

    report_pdf_content = report_pdf_view.render()

    attachments['report.pdf'] = {
      mime_type: 'application/pdf',
      content: report_pdf_content
    }
    mail(:to => recipient_email, :subject => "Your report is attached")
  end
end

答案 1 :(得分:3)

我跟踪了PRAWN的RailsCasts。根据已经说过的内容以及我试图类似地完成的内容,我设置了附件名称,然后创建了PDF。

InvoiceMailer:

 def invoice_email(invoice)
    @invoice = invoice
    @user = @invoice.user
    attachments["#{@invoice.id}.pdf"] = InvoicePdf.new(@invoice, view_context).render
    mail(:to => @invoice.user.email,
         :subject => "Invoice # #{@invoice.id}")
  end

答案 2 :(得分:0)

我的解决方案:

render_to_string('invoices/show.pdf', :type => :prawn)

PDF已损坏,因为我没有写邮件功能块,而且多部分邮件不正确。