Rails 3 почта для пользователей - PullRequest
1 голос
/ 17 февраля 2011


Я хочу отправить рассылку всем зарегистрированным пользователям, но только последний пользователь (в базе данных) получит письмо.

 def letter(nletter)
   @nletter = nletter
   @users=Newsletter.all
   @users.each do |users|
    mail(:to => users.email, :subject => @nletter.subject)
   end
  end

Что не так?

1 Ответ

3 голосов
/ 17 февраля 2011

Если код, который вы нам показали, находится в вашем классе 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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...