Подтвердить что ты не робот

Rails 3 ActionMailer и Wicked_PDF

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

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

class UserMailer < ActionMailer::Base
  default :from => "[email protected]"

  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 in Rails 3) в качестве руководства, я могу отправить электронное письмо с моим желаемым богатым контентом, только если не пытаюсь добавить мое визуализированное вложение.

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Я использовал решения 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

Ответ 3

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

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