Подтвердить что ты не робот

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 и прикрепить его к моей электронной почте. Я открыт для использования чего-то другого, такого как креветка или что-то еще, если мне нужно.

4b9b3361

Ответ 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

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

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