Отправка простой электронной почты в 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')