Rails 3 -Render PDF从视图和附加到电子邮件

我一直在使用Wicked_pdf将视图呈现为PDF和动作管理器来发送电子邮件,但我不能让它们一起工作。 我想使用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 

这是我在动作管理器中的内容:

 class Sendpdf  "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 

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

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

它有两种方式。

  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 

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

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

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

或任何适合wickedPDF的东西。

有两种方法可以按照您的方式执行此操作:

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:直接在邮件程序中创建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 

我正在尝试做一些与你想做的事情类似的事情,尽管它还没有奏效:

 class UserMailer < ActionMailer::Base require "open-uri" include Rails.application.routes.url_helpers default :from => "mail@example.com" def new_user(user) @user = user path_to_url = url_for({ :action=>"show", :controller=>"users", :format =>"pdf", :id => @user }) file = open(path_to_url, "r") attachments["user.pdf"] = file mail(:to => @user.email, :subject => "New user ;)") file.close end end 

基本上它尝试渲染视图本身(它配置了另一种格式),然后将其附加到电子邮件。

唯一的事是它不工作:(