Счет в формате PDF и Mailer в Rails - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь выучить Rails и застрял. У меня есть модели User, Job, Invoice и Customer. Я создаю счет-фактуру и Pdf-счет с Prawn. Счет-фактура в формате PDF не сохраняется (я не хочу сохранять PDF-файлы, просто чтобы просмотреть PDF-файл в браузере), и теперь мне нужна кнопка для отправки счета в формате PDF по электронной почте. У меня в накладной отображается вид 2 кнопки: одна для просмотра PDF, а другая для отправки PDF по электронной почте.

= link_to 'View PDF', invoice_path(@invoice, format: "pdf")
\|
= link_to "Send Email", invoice_mail_path(current_user, @invoice), class: "btn btn-xs btn-primary"

У меня есть:

invoice_mailer.rb

default from: "example@yahoo.com"

  def invoice_mail(invoice, user, job)
    @invoice = invoice
    @user = user
    @job = job
    attachments["#{(@invoice.invoice_number)}.pdf"] = InvoicePdf.new(@invoice, view_context).render

    mail(to: 'example@yahoo.com',
         subject: "A new invoice from xxx")
  end

invoices_controller.rb

def invoice_mail

# @invoice = Invoice.last
@invoice = Invoice.new(@invoice)
@user = current_user
@job = current_user.jobs

InvoiceMailer.invoice_mail(@invoice, @user, @job).deliver_now

flash[:notice] = "Invoice has been sent."
redirect_to invoices_path 
end

routes.rb

get :invoice_mail, to: 'invoices#invoice_mail', as: :invoice_mail

В invoices_controller в def invoice_mail, если у меня есть

@invoice = Invoice.last

работает и отправляет электронное письмо с прикрепленным pdf-файлом, но получает последний счет. Если у меня есть

@invoice = Invoice.new(@invoice)

это дай мне ошибку.

Что мне нужно вместо @invoice = Invoice.last, чтобы получить текущий счет? Или что я не так сделал?

Когда я нажимаю кнопку отправки электронной почты, у меня на терминале:

Started GET "/invoice_mail.16-446cd684-c756-4ea3-a820-17756f44098d" for 127.0.0.1 at 2019-03-22 11:07:30 -0400
Processing by InvoicesController#invoice_mail as 
User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
↳ /Users/ovi_tsb/.rvm/gems/ruby-2.4.1/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
Completed 404 Not Found in 2ms (ActiveRecord: 0.4ms)



ActiveRecord::RecordNotFound (Couldn't find Invoice without an ID):

app/controllers/invoices_controller.rb:124:in `invoice_mail'

1 Ответ

0 голосов
/ 21 марта 2019
@invoice = Invoice.new(@invoice)

Это в вашем контроллере не имеет смысла.Вы присваиваете значение @invoice nil для значения Invoice.new(@invoice), что эквивалентно Invoice.new(nil).Это не должно приводить к ошибкам, но на самом деле это не имеет смысла.

Предположительно, вам нужно найти счет на основе ID .Например:

@invoice = Invoice.find(params[:id])

Это означает, что ваш запрос должен включать параметр :id.Если это не так, вам нужно включить его.Но я считаю, что это должно иметь:

= link_to "Send Email", invoice_mail_path(current_user, @invoice), 
                        class: "btn btn-xs btn-primary"

Во-вторых, link_to выше не обязательно должен включать current_user.current_user является ссылкой на User, захваченный Rails через сеанс пользователя.Другими словами, он будет существовать в вашем контроллере по умолчанию.Так что не беспокойтесь об этом:

= link_to "Send Email", invoice_mail_path(@invoice), 
                         class: "btn btn-xs btn-primary"

Давайте очистим ваш контроллер с помощью этой новой информации:

def invoice_mail
  @invoice = Invoice.find(params[:id]) # :id should be the invoice ID
  @jobs = current_user.jobs

  InvoiceMailer.invoice_mail(@invoice, current_user, @jobs).deliver_now
  flash[:notice] = "Invoice has been sent."
  redirect_to invoices_path 
end
...