Это правильный способ сохранить метод, который не использует actionmailer для отправки электронных писем внутри почтовой программы?
Нет смысла использовать Mailer
в этом случае.Просто используйте сервисный объект (обычный старый объект ruby или PORO).Это может выглядеть примерно так:
class BatchMailerService
attr_accessor *%w(
mail
recipients
recipient
).freeze
delegate *%w(
from
subject
body_text
add_recipient
finalize
), to: :mb_obj
delegate *%w(
address
first_name
last_name
), to: :recipient, prefix: true
class << self
def call(mail, recipients)
new(mail, recipients).call
end
end # Class Methods
#==============================================================================================
# Instance Methods
#==============================================================================================
def initialize(mail, recipients)
@mail, @recipients = mail, recipients
end
def call
setup_mail
add_recipients
message_ids = finalize
end
private
def mg_client
@mg_client ||= Mailgun::Client.new(ENV["your-api-key"])
end
def mb_obj
@mb_obj ||= Mailgun::BatchMessage.new(mg_client, "example.com")
end
def setup_mail
from("me@example.com", {"first" => "Ruby", "last" => "SDK"})
subject("A message from the Ruby SDK using Message Builder!")
body_text("This is the text body of the message!")
end
def add_recipients
recipients.each do |recipient|
@recipient = recipient
add_recipient(
:to,
recipient_address,
{
first: recipient_first_name,
last: recipient_last_name
}
)
end
end
end
Что бы вы использовали что-то вроде:
BatchMailerService.call(mail, recipients)
(при условии, естественно, что у вас есть переменные с именами mail
и recipients
).
Где хранить этот метод?
Вы можете поместить этот файл в app/services/batch_mailer_service.rb
.
Как его можно проверить?
Что вы имеете в виду?То, как вы тестируете услугу, зависит от ваших критериев успеха.Вы можете проверить, что mb_obj
получает вызов finalize
(возможно, используя что-то вроде expect().to receive
).Вы можете проверить message_ids
содержит правильную информацию (возможно, используя что-то вроде expect().to include
).Это отчасти зависит.