ruby on rails - wicked_pdf - Rails 3-Render PDF desde la vista y adjunto al correo electrónico
render_to_string with wicked_pdf (3)
2 buenas maneras de hacer esto de la manera que quieras:
1: Cree el pdf en el controlador, luego envíelo al correo electrónico como parámetro.
# 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: cree el pdf en el remitente directamente (un poco más complicado, pero se puede llamar desde un modelo)
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
He estado usando Wicked_pdf para representar una vista como PDF y actionmailer para enviar correos electrónicos, pero no puedo hacer que trabajen juntos. Quiero adjuntar una versión en PDF de una determinada vista a un correo electrónico utilizando actionmailer y enviarlo haciendo clic en un enlace o un botón. Tengo un comando link_to que envía un correo electrónico. Aquí está mi controlador que obtiene el correo electrónico generado:
def sendemail
@user = User.find(params[:id])
Sendpdf.send_report(@user).deliver
redirect_to user_path(@user)
flash[:notice] = ''Email has been sent!''
end
Aquí está lo que tengo en mi actionmailer:
class Sendpdf < ActionMailer::Base
default :from => "[email protected]"
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
He visto muchas preguntas y respuestas, la mayoría relacionadas con Prawn. Parece que debería haber una respuesta simple a esto. ¿Alguien puede ayudar?
ACTUALIZACIÓN Estoy agradecido por una sugerencia para usar como una opción alternativa en la respuesta a continuación. Sin embargo, realmente me gustaría aprender a renderizar una vista como un PDF y adjuntarlo a mi correo electrónico. Estoy abierto a usar algo diferente como Prawn o cualquier otra cosa si lo necesito.
Estoy tratando de hacer algo similar a lo que quieres hacer, aunque aún no funciona:
class UserMailer < ActionMailer::Base
require "open-uri"
include Rails.application.routes.url_helpers
default :from => "[email protected]"
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
Básicamente, trata de representar la vista (está configurada con otro formato) y luego se adjunta al correo electrónico.
Lo único es que no funciona :(
Hay 2 formas de hacerlo.
O bien, desea que el pdf se incruste en el correo electrónico que está enviando, de modo que cuando el usuario descarga el pdf del correo electrónico, no se solicite la acción de renderizar pdf para su controlador respectivo.
No sé cómo hacer esto de manera eficiente porque nunca lo he hecho antes.O simplemente proporciona un enlace al pdf en su correo electrónico y cuando el usuario hace clic en él, ahora se llama a la acción para crear el pdf, y luego el usuario puede descargarlo.
De esta manera, si hay una gran carga en el servidor para la descarga de los pdf, puede redirigir estas solicitudes a otro lugar. En resumen, hay un gran margen para la eficiencia.
Un código de muestra para el segundo método (el código proporcionado se escribió usando PDFkit, por lo tanto, cambie en consecuencia):
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
Reemplace el contenido de Pdf.find(params[:id]).content
to_pdf
su elección y el método to_pdf
, según wickedPDF.
Luego, simplemente puede pasar el enlace para la descarga de pdf en su correo electrónico como este
<%= link_to "Download", pdf_pdf_path(pdf, :format => "pdf") %>
o lo que se adapte según wickedPDF.