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