Rails 3 -Render PDF из просмотра и прикрепляется к электронной почте
Я использую 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 => "[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
Я видел много вопросов и ответов, большинство из которых касалось креветки. Кажется, должен быть простой ответ на этот вопрос. Может ли кто-нибудь помочь?
ОБНОВЛЕНИЕ Я благодарен за предложение использовать в качестве альтернативного варианта в ответе ниже. Тем не менее, мне бы очень хотелось узнать, как сделать представление в формате PDF и прикрепить его к моей электронной почте. Я открыт для использования чего-то другого, такого как креветка или что-то еще, если мне нужно.
Ответы
Ответ 1
Есть два способа для этого.
-
Либо вы хотите, чтобы 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
Замените Pdf.find(params[:id]).content
в соответствии с вашим выбором и метод to_pdf
, согласно wickedPDF.
Затем вы можете просто передать ссылку для загрузки pdf в свой адрес электронной почты следующим образом
<%= link_to "Download", pdf_pdf_path(pdf, :format => "pdf") %>
или все, что подходит для wickedPDF.
Ответ 2
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
Ответ 3
Я пытаюсь сделать что-то похожее, как то, что вы хотите сделать, хотя оно еще не работает:
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
В основном он пытается отобразить представление (он настроен с другим форматом), а затем привязывает его к письму.
Единственное, что он не работает: (