Rails 3 ActionMailer и Wicked_PDF - PullRequest
       44

Rails 3 ActionMailer и Wicked_PDF

22 голосов
/ 24 марта 2011

Я пытаюсь сгенерировать электронные письма с вложенными PDF-вложениями, используя ActionMailer и wicked_pdf.

На моем сайте я уже использую и wicked_pdf, и actionmailer отдельно. Я могу использовать wicked_pdf для показа PDF-файла в веб-приложении и использовать ActionMailer для отправки почты, но у меня возникают проблемы с подключением отображаемого содержимого PDF к ActionMailer (отредактировано для содержимого):

class UserMailer < ActionMailer::Base
  default :from => "webadmin@mydomain.com"

  def generate_pdf(invoice)
    render :pdf => "test.pdf",
     :template => 'invoices/show.pdf.erb',
     :layout => 'pdf.html'
  end

  def email_invoice(invoice)
    @invoice = invoice
    attachments["invoice.pdf"] = {:mime_type => 'application/pdf',
                                  :encoding => 'Base64',
                                  :content => generate_pdf(@invoice)}
    mail :subject => "Your Invoice", :to => invoice.customer.email
  end
end

Используя Railscasts 206 (Action Mailer в Rails 3) в качестве руководства, я могу отправлять электронную почту с моим желаемым расширенным содержимым, только если я не пытаюсь добавить свое отображаемое вложение.

Если я пытаюсь добавить вложение (как показано выше), я получаю вложение того, что выглядит нужного размера, только имя вложения не соответствует ожидаемому и не может быть прочитано в формате PDF , В дополнение к этому, содержание моего письма отсутствует ...

Есть ли у кого-нибудь опыт использования ActionMailer при рендеринге PDF на лету в Rails 3.0?

Заранее спасибо! --Dan

Ответы [ 3 ]

30 голосов
/ 02 апреля 2011

WickedPDF может визуализировать в файл просто отлично, чтобы прикрепить к электронной почте или сохранить в файловой системе.

Ваш метод выше не будет работать для вас, потому что generate_pdf - это метод почтовой программы, который возвращает почтовый объект (не тот PDF, который вы хотели)

Кроме того, в ActionMailer есть ошибка, приводящая к искажению сообщения при попытке вызвать метод render в самом методе

http://chopmode.wordpress.com/2011/03/25/render_to_string-causes-subsequent-mail-rendering-to-fail/

https://rails.lighthouseapp.com/projects/8994/tickets/6623-render_to_string-in-mailer-causes-subsequent-render-to-fail

Есть 2 способа сделать эту работу,

Первый - использовать хак, описанный в первой статье выше:

def email_invoice(invoice)
  @invoice = invoice
  attachments["invoice.pdf"] = WickedPdf.new.pdf_from_string(
    render_to_string(:pdf => "invoice",:template => 'documents/show.pdf.erb')
  )
  self.instance_variable_set(:@lookup_context, nil)
  mail :subject => "Your Invoice", :to => invoice.customer.email
end

Или вы можете установить вложение в блок следующим образом:

def email_invoice(invoice)
  @invoice = invoice
  mail(:subject => 'Your Invoice', :to => invoice.customer.email) do |format|
    format.text
    format.pdf do
      attachments['invoice.pdf'] = WickedPdf.new.pdf_from_string(
        render_to_string(:pdf => "invoice",:template => 'documents/show.pdf.erb')
      )
    end
  end
end
4 голосов
/ 14 июня 2011

Я использовал описанные выше решения Unixmonkey, но потом, когда я обновился до rails 3.1.rc4, установка переменной экземпляра @lookup_context больше не работала.Возможно, есть и другой способ добиться такой же очистки контекста поиска, но сейчас настройка вложения в почтовом блоке работает нормально, например:

  def results_email(participant, program)
    mail(:to => participant.email,
         :subject => "my subject") do |format|
      format.text
      format.html
      format.pdf do
        attachments['trust_quotient_results.pdf'] = WickedPdf.new.pdf_from_string(
          render_to_string :pdf => "results",
               :template => '/test_sessions/results.pdf.erb',
               :layout => 'pdf.html')
      end
   end
  end
0 голосов
/ 30 марта 2011

Вот как я решил эту проблему:

  1. Удалено wicked_pdf
  2. Установлена ​​креветка (https://github.com/sandal/prawn/wiki/Using-Prawn-in-Rails)

Пока Prawn есть / была немногоболее громоздким в оформлении документа, он может легко перебирать почтовые вложения ...

...