Как мне прикрепить ppnto-рендеринг .pdf к электронному письму в Rails 2.3.5? - PullRequest
11 голосов
/ 15 октября 2010

Мое приложение создает файл .pdf при его визуализации, передавая его по URL-адресу (например, domain.com/letter/2.pdf)

Он нигде не сохраняется.

Как я могу сделать этот фактический pdf-файл вложением в исходящем письме.

Вот мой почтовик:

  def campaign_email(contact,email)
    subject    email.subject
    recipients contact.email
    from       'Me <me@me.com>'
    sent_on    Date.today

    attachment = File.read("http://localhost:3000/contact_letters/#{attachment.id}.pdf")

   attachment "application/pdf" do |a|
    a.body = attachment
    a.filename = "Othersheet.pdf" 
   end
 end

Этот контроллер создает/ рендерит PDF:

def create
    @contact_letter = ContactLetter.new(params[:contact_letter])

    @contact = Contact.find_by_id(@contact_letter.contact_id)
    @letter = Letter.find_by_id(@contact_letter.letter_id)

    if @contact_letter.save
      flash[:notice] = "Successfully created contact letter."

      #redirect_to contact_path(@contact_letter.contact_id)
      redirect_to contact_letter_path(@contact_letter, :format => 'pdf')
    else
      render :action => 'new'
    end
  end

ПРИМЕЧАНИЕ. Я жестко запрограммировал localhost: 3000 / как я могу заменить его переменной, чтобы на dev это было localhost: 3000, а на производстве это правильный домен?Есть ли способ включить маршрутизацию в это?)

ОШИБКА: я получаю

Неверный аргумент - http://localhost:3000/contact_letters/9.pdf

Ответы [ 3 ]

5 голосов
/ 15 октября 2010

Вот пример для рельсов 2

class ApplicationMailer < ActionMailer::Base
# attachments
def signup_notification(recipient, letter)
  recipients      recipient.email_address_with_name
  subject         "New account information"
  from            "system@example.com"

  attachment :content_type => "image/jpeg",
    :body => File.read("an-image.jpg")

  attachment "application/pdf" do |a|
    a.body = letter
  end
end
end

по вашему мнению или везде, где вы вызываете ваш метод:

ApplicationMailer.deliver_signup_notification(letter)
0 голосов
/ 17 марта 2011

Я заставил его работать, передав объект pdf непосредственно в метод campaign_email и затем назначив вложение.

0 голосов
/ 26 октября 2010

одним быстрым и простым решением было бы получить URL-адрес, используя net / http и open-uri, чтобы получить вложение

attachments['free_book.pdf'] = open("http://#{request.host}/letter/#{id}.pdf")

например:

def campaign_email(contact,email)
    subject    email.subject
    recipients contact.email
    attachments['free_book.pdf'] = open("http://#{request.host}/letter/#{id}.pdf")
    from       'Me <me@me.com>'
    sent_on    Date.today

    body       :email => email
end

или, вызовите генерацию PDF внутри действия контроллера почтовой программы

...