2015-11-10 2 views
2

У меня есть этот код в ApplicationController (Ruby On Rails 4.1):Is ActionMailer :: Base.default_url_options thread safe?

before_action :make_action_mailer_use_request_host_and_protocol 

def make_action_mailer_use_request_host_and_protocol 
    ActionMailer::Base.default_url_options[:protocol] = request.protocol 
    ActionMailer::Base.default_url_options[:host] = request.host_with_port 
    ActionMailer::Base.asset_host = "#{request.protocol}#{request.host_with_port}" 
end 

ли это поточно-? Рассмотрим сценарий:

  1. Сервер начинает обрабатывать запрос для хоста foo.example.com. Он устанавливает хост для ActionMailer.
  2. Другой запрос приходит до того, как сервер завершит обработку первой, на этот раз для host bar.example.com. Сервер устанавливает хост ActionMailer на bar.example.com.
  3. Выполнение возвращается к первому запросу. Теперь сервер отправляет электронную почту. Каким будет узел в письме, foo.example.com или bar.example.com?

ответ

1

К сожалению, описанный выше метод не является потокобезопасным, и описанный вами сценарий будет проблематичным.

Создание метода default_url_options в вашем контроллере в настоящее время the most idiomatic (and thread-safe) way to accomplish this.

Я нашел Simone Carletti's actionmailer_with_request gem, чтобы быть идеальным решением проблемы, с которой вы, похоже, сталкиваетесь.

+0

Кажется, я помню билет Rails для этого, но я не могу отследить его за короткое время, которое у меня есть. –

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/10161975) – Aleph7

+0

@ Aleph7 Ссылка не является ответом, это способ достижения цели. «К сожалению, это не поточно-безопасный» - это ответ. Это не ответ только для ссылок. Пожалуйста, обратите больше внимания при рассмотрении. –