with wicked_pdf render_to_string rails library generation generate ruby-on-rails ruby-on-rails-3 pdf-generation actionmailer wicked-pdf

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.

  1. 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.

  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 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.