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

时间:2011-04-23 06:16:39

标签: ruby-on-rails ruby-on-rails-3 pdf-generation actionmailer 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  

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

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

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

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

3 个答案:

答案 0 :(得分:36)

以你想要的方式做到这一点的两种好方法:

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

答案 1 :(得分:6)

有两种方法。

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

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

  3. 第二种方法的示例代码(提供的代码是使用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,并根据wickedPDF替换to_pdf方法。

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

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

    或任何适合wickedPDF的东西。

答案 2 :(得分:0)

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

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

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

唯一的问题是它不起作用:(