PDF файлы в формате PDF

В моем приложении Rails я пытаюсь приложить счет к электронной почте:

def invoice(invoice)
  attachment :content_disposition => "attachment",
             :body => InvoicePdf.new(invoice),
             :content_type => "application/pdf",
             :filename => 'invoice.pdf'

  mail(:to => @user.email, :subject => "Your Invoice")
end

InvoicePdf - это документ в формате PDF:

class InvoicePdf < Prawn::Document
  def initialize(order, view)
    draw_pdf
  end

  def draw_pdf
    # pdf stuff
  end
end

Я не получаю вложений в электронном письме. Что я делаю не так? Любые советы приветствуются и оцениваются.

Изменить: Реализована версия Rails 3.0.x

Ответ 1

Взгляните на Руководство по описанию действий. Вам нужно вызвать метод вложений для добавления вложения.

Попробуйте следующее:

attachments['attachment_filename'] = InvoicePdf.new(invoice)

Предполагается, что вызов InvoicePdf.new(invoice) генерирует файл и возвращает объект IO, представляющий этот файл. Я также заметил, что ваш инициализатор класса InvoicePdf ожидает два параметра, но вы передаете только один.

Update: Также обратите внимание, что Action Mailer возьмет имя файла и выработает тип mime, установите Content-Type, Content-Disposition, Content-Transfer-Encoding и base64 закодируйте содержимое вложения для вас, так что установка его вручную не необходимо, если вы не хотите переопределять значения по умолчанию.

Основываясь на методе генерации pdf, это, вероятно, будет лучше:

invoice = InvoicePdf.new(invoice)
attachments["invoice.pdf"] = { :mime_type => 'application/pdf', :content => invoice.render }
mail(:to => @user.email, :subject => "Your Invoice")

Ответ 2

Разве это просто

attachments["invoice.pdf"] = InvoicePdf.new(invoice)

так как 3.0?