Я знаю, что это было давно, но лучшие практики никогда не умирают, верно? :)
Электронная почта - это по определению асинхронный обмен данными (за исключением подтверждения по электронной почте, но даже в этом случае рекомендуется оставить задержку перед подтверждением).
Следовательно, по моему мнению, самый логичный способ отправить это:
- в фоновом режиме (используя Sidekiq или delayed_job )
- в методе обратного вызова: «эй, это действие успешно выполнено, может быть, мы можем рассказать миру сейчас?»
Проблема в Rails заключается в том, что обратных вызовов не так много (как, например, в JS): лично я считаю грязным иметь такой код:
after_save :callback
def callback
if test_that_is_true_once_in_the_objects_life
Mailer.send_email()
end
end
Итак, если вы действительно хотите мыслить как программист , идея будет заключаться в том, чтобы настроить некоторую систему обратного вызова в вашем приложении.
Например.
def run_with_callback(action, callback_name)
if send(action)
delay.send(callback_name)
end
end
Или даже создание системы событий в вашем приложении было бы достойным решением.
Но, в конце концов, эти решения довольно дорогие по времени, поэтому люди в конечном итоге пишут его после действия
def activate
[...]
user.save
Mailer.send_mail
respond_to
[...]
end
, который является наиболее близким способом к обратному вызову в синхронном программировании и приводит к тому, что Mailers вызывает везде (в Model
и Controller
).