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

Fat*_*yan 20 pdf-generation ruby-on-rails actionmailer ruby-on-rails-3 wicked-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  
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

Uni*_*key 36

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个糟糕的方法,但有时候写文件系统是不可取的,就像在Heroku上一样.另外,请注意,某些其他进程无法移动或删除您的文件. (2认同)

Jat*_*tra 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
Run Code Online (Sandbox Code Playgroud)

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

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

<%= link_to "Download", pdf_pdf_path(pdf, :format => "pdf") %>
Run Code Online (Sandbox Code Playgroud)

或任何适合wickedPDF的东西.