Rails 4:将邮件附件添加为远程.pdf文件

时间:2014-02-04 11:38:17

标签: ruby-on-rails ruby pdf ruby-on-rails-4

我想要获得的结果是来自远程网址的添加文件,该文件已生成*.pdf个文件。

我的邮件代码

def invoice(partner, invoice)
    @invoice = invoice
    attachments["invoice.pdf"] = open("http://127.0.0.1/invoice/#{invoice.id}.pdf").read
    mail :to => partner.email, :subject => "Invoice to partner"
end

但是这段代码会返回错误:

Invalid argument - http://127.0.0.1/invoice/14.pdf

2 个答案:

答案 0 :(得分:4)

您不应让服务器向自己发出http请求来呈现页面!它拥有制作pdf文件所需的所有资源。

我不使用prawn,我使用acts_as_flying_saucer,它是flying_saucer java应用程序的rails包装器,但我怀疑它的工作方式类似:你应该(如果你还没有)使用rails“包装器” “对于Prawn - 它应该为您提供一些方法,您可以在控制器中使用它们来呈现PDF格式。

例如,在acts_as_flying_saucer中,我会像这样制作一个pdf:

render_pdf:template => “路径/到/一个/ template.html.erb”,   :layout => “flying_saucer.html.erb”   :pdf_file => File.basename(temp_filename)

这将在我的/ tmp文件夹中构建pdf,然后我可以根据需要将其附加到电子邮件中,或者使用send_file或其他任何方式将其发送回用户。

Prawn的rails包装器会给你一个类似的命令。看看prawnto或prawn-rails,或者,如果你已经使用了rails wrapper gem / plugin,请阅读api。

答案 1 :(得分:1)

您需要在项目中传递路径到文件,如下所示:

def invoice(partner, invoice)
  @invoice = invoice
  attachments["invoice.pdf"] = File.read("path/to/you/file.pdf")
  mail :to => partner.email, :subject => "Invoice to partner"
end

更新
我建议首先创建此文件,然后应用于该字母,因为该文件在Base64中发送编码时。例如:

class MyMailer < ActionMailer::Base

  def invoice(partner, invoice)
    @invoice = invoice
    add_pdf!
    mail :to => partner.email, :subject => "Invoice to partner"
  end

  private

  def add_pdf!
    file = some_method_what_generate_and_save_pdf
    attachments["invoice.pdf"] = file.read
  end
end