2012-02-27 16 views
7

Come rendere il pdf di gamberi come allegato in ActionMailer? Uso delayed_job e non capisco, come potrei renderizzare il file pdf nel mailer di azione (non nel controller). Quale formato dovrei usare?Rails 3 Render Prawn pdf in ActionMailer

risposta

7

Devi solo dire a Prawn di eseguire il rendering del PDF in una stringa, quindi aggiungerlo come allegato al messaggio di posta elettronica. Consulta lo ActionMailer docs per i dettagli sugli allegati.

Ecco un esempio:

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 
+0

ho già viste/fatture/show.pdf.prawn. InvoicesController lo esegue correttamente. Ho provato a renderlo utilizzando render_to_string nel mailer e ho ottenuto PDF corrotto. Come rendere questo file di visualizzazione esistente? Potrebbe essere necessario specificare: tipo o formato per render_to_string. – maxs

0

La mia soluzione:

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

PDF è stato danneggiato perché non ho scritto blocco per la funzione di posta elettronica e-mail in più parti non era corretto.

3

Ho seguito i RailsCasts per PRAWN. Preso ciò che è già stato detto e ciò che stavo cercando di ottenere allo stesso modo, ho impostato il nome dell'allegato e poi ho creato il 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 
Problemi correlati