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)
它有两种方式.
或者,您希望将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
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的东西.
| 归档时间: |
|
| 查看次数: |
14117 次 |
| 最近记录: |