18

He estado usando Wicked_pdf para renderizar una vista como PDF y Actionmailer para enviar correos electrónicos, pero no puedo hacer que funcionen juntos. Quiero adjuntar una versión en PDF de una determinada vista a un correo electrónico utilizando Actionmailer y enviarla 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 recibe el correo electrónico generado:Rails 3 -Render PDF de la vista y adjuntarlo al correo electrónico

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í es 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, más trato con gambas. Parece que debería haber una respuesta simple a esto. ¿Alguien puede ayudar?

ACTUALIZACIÓN Agradezco una sugerencia para utilizar como una opción alternativa en la respuesta a continuación. Sin embargo, me gustaría aprender cómo renderizar una vista como PDF y adjuntarla a mi correo electrónico. Estoy abierto a usar algo diferente como gambas o cualquier otra cosa si es necesario.

Respuesta

6

Hay 2 formas de hacerlo.

  1. O, desea que el pdf para ser embebido en el correo electrónico que va a enviar, de manera que cuando el usuario descarga el pdf del correo electrónico, no hay ninguna solicitud para el render nueva acción pdf para su respectivo controlador.
    No sé cómo hacerlo de manera eficiente porque nunca he hecho esto antes.

  2. 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 ejemplo para el segundo método (código proporcionado fue escrito por el uso de PDFKit, por lo que cambiar 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 

Vuelva a colocar la Pdf.find(params[:id]).content como por su elección, y el método to_pdf, según malvadoPDF.

A continuación, puede simplemente 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 sea apropiado según wickedPDF.

+0

Eso es una gran opción, no había pensado en eso en realidad. Si tengo mi elección me gustaría adjuntar el PDF al correo electrónico, pero hasta que lo descubra, poner una "descarga" en el correo electrónico es una gran idea, ¡gracias! – FattRyan

+0

Esto no responde a la pregunta tal como se planteó. Las soluciones a menudo se usan mejor para comentarios, no respuestas. – ghayes

33

2 buenas maneras de hacer esto de la manera deseada:

1: Crear el pdf en el controlador, a continuación, enviar el correo electrónico que a como un 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: Crear el pdf en el gestor de correo directamente (un poco más complicado, pero puede ser llamado 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 
+0

Gracias por responder esta pregunta. Lo que terminé haciendo fue crear una acción para guardar un pdf en un archivo. Luego, en la acción para enviar el correo, llamé a esta acción, la adjunté al correo electrónico y luego la borré del archivo. ¿Es eso un error? forma de hacerlo? Funciona muy bien – FattRyan

+2

No es una mala manera, pero a veces no se desea escribir en el sistema de archivos, como en Heroku. Además, tenga cuidado de que sus archivos no puedan ser movidos o eliminados por algún otro proceso. – Unixmonkey

+1

@Unixmonkey Solo para agregar a esto, he notado que la mayoría de las respuestas sobre WickedPDF provienen de usted. He buscado alto y bajo en todas sus respuestas y he configurado lo siguiente: https://gist.github.com/anonymous/5229508 pero parece que no puedo encontrarlo. Cada solución que he intentado parece darme una 'Plantilla faltante'. Espero su respuesta. – David

0

que estoy tratando de hacer algo similar a lo que quiere hacer, a pesar de que todavía no está funcionando:

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 se trata de hacer que la vista en sí (que se configura con otro formato) y luego se adjunta al correo electrónico.

Lo único es que no funciona :(

Cuestiones relacionadas