Отправка простой электронной почты в Rails

Я прочитал несколько вопросов и http://guides.rubyonrails.org/action_mailer_basics.html о том, как отправлять электронные письма с помощью Rails, но не могу заставить его работать в контексте моего текущего приложения.

У меня был существующий emailer.rb с парой методов, которые были идентичны, кроме параметров, которые они приняли, были названы по-разному, поэтому я скопировал их формат:

def quotation_notification(q)
  @recipients  = q.recipient_email
  @from        = q.partner_name + "<#{q.partner_email}>"
  @subject     = "New Quotation from " + q.partner_name
  @body[:q]    = q
end

Затем я создал новый файл представления в emailers названный quotation_notification.rhtml который просто содержит текст на данный момент.

Затем я вызываю функцию из другого контроллера и отправляю жестко закодированные параметры:

q = QuotationEmail.new(:recipient_email => 'martin@domain.co.uk', :partner_name => 'Martin Carlin', :partner_email => 'martin@domain.co.uk')

# send email
Emailer.deliver_quotation_notification(q)

Затем, наконец, я создал новую модель для QuotationEmail

class QuotationEmail

  def initialize(recipient_email, partner_name, partner_email)
    @recipient_email = recipient_email
    @partner_name = partner_name
    @partner_name = partner_email
  end

end

Я получаю ошибку ArgumentError (wrong number of arguments (1 for 3))

В конце концов, я отправлю больше параметров и, надеюсь, приложу PDF-файл, но просто попытаюсь выяснить, почему это не работает в первую очередь.

1 ответ

Решение

Вы получаете эту ошибку, потому что при инициализации объекта QuotationEmail, хотя вы думаете, что передаете 3 параметра, вы, по сути, передаете только один параметр, который является хешем. И инициализация ожидает 3. См. Пример ниже

class A
  def initialize(a,b=1,c=2)
    puts a
    puts b
    puts c
  end
end

a = A.new(:recipient_email => 'martin@domain.co.uk', :partner_name => 'Martin Carlin', :partner_email => 'martin@domain.co.uk')

#=> {:recipient_email=>"martin@domain.co.uk", :partner_name=>"Martin Carlin", :partner_email=>"martin@domain.co.uk"}
#=> 1
#=> 2

Если вы пытаетесь использовать именованные параметры, вам нужно переопределить инициализацию как

def initialize(recipient_email:a,partner_name:b,partner_email:c)

и вызвать его, как показано ниже -

a = A.new(recipient_email:'martin@domain.co.uk', partner_name:'Martin Carlin', partner_email:'martin@domain.co.uk')
Другие вопросы по тегам