Если код, который вы нам показали, находится в вашем классе Mailer, то это потому, что метод mail
просто устанавливает различные атрибуты объекта Mail. Когда вы перебираете всех своих пользователей и вызываете mail
для каждого, вы просто сбрасываете тему и (что более важно) получателя на один объект Mail. Поэтому, когда функция завершает работу и Почта отправляется, текущий получатель является последним пользователем, которого вы установили, - последним пользователем в вашей базе данных.
Вы можете обойти это двумя разными способами. Если это общая электронная почта (все получают одно и то же сообщение), вы можете просто передать массив адресов электронной почты как :to
:
Примечание: Как отмечает Джош в комментариях, вы почти всегда захотите использовать :bcc
вместо :to
, поэтому вы не станете транслировать весь свой список рассылки.
def letter(nletter)
@nletter = nletter
@users=Newsletter.all
mail(:to => @users.map(&:email), :subject => @nletter.subject)
end
Но если каждый пользователь получает свое электронное письмо ("Hi, #{username}!"
или что-то подобное), вам придется создать новый объект Mail для каждого пользователя. Вы можете сделать это, позвонив Mailer.deliver_letter(nletter, user)
для каждого пользователя:
# Somewhere outside of your Mailer:
nletter = "...whatever..."
Newsletter.all.each do |user|
Mailer.deliver_letter(nletter, user)
end
# And your mailer function would look like:
def letter(nletter, user)
@nletter = nletter
mail(:to => user.email, :subject => @nletter.subject)
end
Надеюсь, это поможет!