ruby-on-rails-3 - Rails 3 ActionMailer和Wicked_PDF

标签 ruby-on-rails-3 actionmailer wicked-pdf

我正在尝试使用ActionMailer和wicked_pdf生成带有渲染的PDF附件的电子邮件。

在我的网站上,我已经分别使用了wicked_pdf和actionmailer。我可以使用wicked_pdf在Web应用程序中提供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(Rails 3中的Action Mailer)作为指南,只有当我不尝试添加渲染的附件时,我才能发送具有所需丰富内容的电子邮件。

如果尝试添加附件(如上所示),则会得到看起来正确大小的附件,只有附件的名称未按预期出现,也无法以pdf格式读取。除此之外,我的电子邮件内容丢失了...

在Rails 3.0中动态渲染PDF时,是否有人有使用ActionMailer的经验?

提前致谢!
- 担

最佳答案

WickedPDF可以很好地呈现到文件中,以便附加到电子邮件或保存到文件系统。

您上面的方法对您不起作用,因为generate_pdf是邮件程序上的一种方法,它返回一个邮件对象(而不是您想要的PDF)

另外,如果您尝试在方法本身中调用render,则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

有两种方法可以使这项工作有效,

首先是使用上面第一篇文章中描述的hack:

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

关于ruby-on-rails-3 - Rails 3 ActionMailer和Wicked_PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5421615/

相关文章:

ruby-on-rails - Rails 可选/:locale route

ruby-on-rails - find_commentable 返回未定义的方法 `comments' for nil :NilClass

ruby-on-rails-3 - 生产服务器上的 wicked_pdf

ruby-on-rails-3 - ActionMailer 的未定义方法 `before_action'

javascript - Wicked_pdf 逐页设置页脚高度或边距

javascript - wkhtmltopdf offset高度差

ruby-on-rails-3 - 帮助从 Rails 查询数据

ruby-on-rails - 在 rails 中向 link_to 添加方法和 html 选项?

ruby-on-rails - 我在哪里放置 ActionMailer View 的辅助方法?

ruby-on-rails - 在 Ruby on Rails 中将 zip 文件作为附件发送