20

我一直在使用 Wicked_pdf 将视图呈现为 PDF 并使用 actionmailer 发送电子邮件,但我无法让它们一起工作。我想使用 actionmailer 将某个视图的 PDF 版本附加到电子邮件中,然后通过单击链接或按钮将其发送出去。我有一个发送电子邮件的 link_to 命令。这是获取生成电子邮件的控制器:

def sendemail
 @user = User.find(params[:id])
 Sendpdf.send_report(@user).deliver
 redirect_to user_path(@user)
 flash[:notice] = 'Email has been sent!'
end  

这是我在 actionmailer 中的内容:

class Sendpdf < ActionMailer::Base
default :from => "myemail@email.com"

def send_report(user)
@user = user
  attachment "application/pdf" do |a|
  a.body = #Something should go here, maybe WickedPDF.new.something?
  a.filename = 'MyPDF'
end     
mail(:to => user.email, :subject => "awesome pdf, check it")
end

end

我看过很多问题和答案,大多数是与虾打交道的。似乎应该有一个简单的答案。任何人都可以帮忙吗?

更新我很感激在下面的答案中使用作为替代选项的建议。但是,我真的很想学习如何将视图呈现为 PDF 并将其附加到我的电子邮件中。如果需要,我愿意使用不同的东西,比如 Prawn 或其他任何东西。

4

2 回答 2

39

2种按照您想要的方式执行此操作的好方法:

1:在控制器中创建pdf,然后将其作为参数发送到电子邮件。

# controller
def sendemail
  @user = User.find(params[:id])
  pdf = render_to_string :pdf => 'MyPDF'
  Sendpdf.send_report(@user, pdf).deliver
  redirect_to user_path(@user)
  flash[:notice] = 'Email has been sent!'
end

# mailer
def send_report(user, pdf)
  @user = user
  attachments['MyPDF.pdf'] = pdf
  mail(:to => user.email, :subject => "awesome pdf, check it")
end

2:直接在mailer中创建pdf(有点牵强,但可以从模型中调用)

def send_report(user)
  @user = user
  mail(:to => user.email, :subject => "awesome pdf, check it") do |format|
    format.text # renders send_report.text.erb for body of email
    format.pdf do
      attachments['MyPDF.pdf'] = WickedPdf.new.pdf_from_string(
        render_to_string(:pdf => 'MyPDF',:template => 'reports/show.pdf.erb')
      )
    end
  end
end
于 2011-04-28T03:48:53.203 回答
6

有两种方法。

  1. 或者,您希望将 pdf 嵌入到您发送的电子邮件中,以便当用户从电子邮件中下载 pdf 时,不会请求为您各自的控制器呈现新的 pdf 操作。
    我不知道如何有效地做到这一点,因为我以前从未这样做过。

  2. 或者,您只需在电子邮件中提供指向 pdf 的链接,当用户单击它时,现在调用创建 pdf 的操作,然后用户可以下载它。
    这样,如果服务器上下载 pdf 的负担很大,您可以将这些请求重定向到其他地方。简而言之,效率的空间很大。

第二种方法的示例代码(提供的代码是使用 PDFkit 编写的,因此请相应更改):

class PdfsController < ApplicationController
  def pdf
    respond_to do |format|
      format.pdf { render :text => wickedPDF.new( Pdf.find(params[:id]).content ).to_pdf }
    end
  end
...
end

根据 wickedPDF替换Pdf.find(params[:id]).content您的选择和方法。to_pdf

然后,您可以像这样在电子邮件中简单地传递 pdf 下载的链接

<%= link_to "Download", pdf_pdf_path(pdf, :format => "pdf") %>

或任何适合 wickedPDF 的东西。

于 2011-04-23T10:45:16.460 回答