2012-02-27 15 views
7

Jak renderować krewetki pdf jako załącznik w ActionMailer? Używam delayed_job i nie rozumiem, jak mogę renderować plik pdf w akcji mailer (nie w kontrolerze). Jakiego formatu mam użyć?Rails 3 Render Prawn pdf w ActionMailer

Odpowiedz

7

Wystarczy powiedzieć Prawn, aby przekonwertować plik PDF na ciąg znaków, a następnie dodać go jako załącznik do wiadomości e-mail. Zobacz ActionMailer docs, aby uzyskać szczegółowe informacje na temat załączników.

Oto przykład:

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

mam już ciami/faktur/show.pdf.prawn. InvoicesController wykonuje to pomyślnie. Próbowałem renderować go za pomocą render_to_string w mailer i dostałem uszkodzony plik PDF. Jak renderować ten istniejący plik widoku? Może być muszę określić: typ lub format dla render_to_string. – maxs

0

Moje rozwiązanie:

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

PDF został uszkodzony, bo nie pisać blok dla funkcji poczty i wieloczęściowe e-mail był nieprawidłowy.

3

Śledziłem RailsCasts dla PRAWN. Podejmując to, co już zostało powiedziane i co starałem się osiągnąć podobnie, ustawiłem nazwę załącznika, a następnie utworzyłem plik 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 
Powiązane problemy