Rails 3 -Render PDF от просмотра и прикрепить к электронной почте - PullRequest
20 голосов
/ 23 апреля 2011

Я использовал Wicked_pdf для рендеринга представления в виде PDF и actionmailer для отправки электронных писем, но я не могу заставить их работать вместе. Я хочу прикрепить PDF-версию определенного представления к электронному письму, используя actionmailer, и отправить его, нажав ссылку или кнопку. У меня есть команда 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  

Вот что у меня есть в моем actionmailer:

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

Я видел много вопросов и ответов, большинство из которых касалось креветок. Кажется, на этот вопрос должен быть простой ответ. Кто-нибудь может помочь?

ОБНОВЛЕНИЕ Я благодарен за предложение использовать альтернативный вариант в ответе ниже. Однако мне бы очень хотелось узнать, как отобразить представление в формате PDF и прикрепить его к своей электронной почте. Я открыт для использования чего-то другого, например, креветок или чего-то еще, если мне нужно.

Ответы [ 3 ]

36 голосов
/ 28 апреля 2011

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

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
6 голосов
/ 23 апреля 2011

Для этого есть 2 способа.

  1. Либо, вы хотите, чтобы PDF-файл был встроен в отправляемое вами электронное письмо, чтобы при загрузке PDF-файла пользователем из электронного письма,нет запроса на рендеринг нового действия pdf для вашего соответствующего контроллера.
    Я не знаю, как сделать это эффективно, потому что я никогда не делал этого раньше.

  2. Или,Вы просто указываете ссылку на PDF-файл в своем электронном письме, и когда пользователь нажимает на него, теперь вызывается действие для создания PDF-файла, а затем пользователь может загрузить его.
    Таким образом, если возникает большая нагрузкана сервере для загрузки PDF-файлов, вы можете перенаправить эти запросы в другом месте.Короче говоря, существует огромный диапазон эффективности.

Пример кода для 2-го метода (предоставленный код был написан с использованием 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 согласно вашему выбору и метод to_pdf согласно wickedPDF.

Затем вы можете просто передать ссылку для скачивания в формате PDF в своем письме, например,

<%= link_to "Download", pdf_pdf_path(pdf, :format => "pdf") %>

или любой другой костюм, соответствующий wickedPDF.

0 голосов
/ 12 октября 2011

Я пытаюсь сделать что-то похожее на то, что вы хотите сделать, хотя оно еще не работает:

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

По сути, оно пытается отобразить само представление (оно настроено в другом формате), а затем приложил его к электронной почте.

Единственное, что он не работает: (

...