我一直在使用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或其他任何东西。
答案 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)
有两种方法。
或者,您希望将pdf嵌入到您要发送的电子邮件中,以便当用户从电子邮件中下载pdf时,不会向您的控制器请求渲染新的pdf操作。<登记/> 我不知道如何有效地做到这一点,因为我以前从未这样做过。
或者,您只需在电子邮件中提供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
,并根据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
基本上它会尝试渲染视图本身(它配置了另一种格式),然后将其附加到电子邮件中。
唯一的问题是它不起作用:(