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
Ответы
Ответ 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
Вот как я исправил эту проблему:
В то время как креветка была/была немного более громоздкой при оформлении документа, она может легко перемещаться по почтовым вложениям...