Как вы возвращаетесь из функции ActionMailer :: Base? - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь реализовать функцию ActionMailer, которая будет отправлять рассылку конкретному пользователю. Я хочу убедиться, что новостная рассылка отправляется только подписчикам. Я попытался реализовать это так:

class UserMailer < ActionMailer::Base
  def newsletter(user)
    return unless user.subscribed # This still renders my mailer view

    mail(:to => user.email, :subject => "Newsletter")
  end
end

Проблема в том, что строка return unless user.subscribed по-прежнему отображает представление почтовой программы и все еще отправляется вызывающим кодом (из задания cron):

task :cron => :environment do
  User.where(:subscribed => true).each do |user|
    UserMailer.newsletter(user).deliver
  end
end

Обратите внимание, что у меня есть эта логика подписки в моей работе cron также по соображениям производительности (не нужно перебирать ВСЕХ пользователей, только тех, которые подписаны). Однако создается впечатление, что класс UserMailer является подходящим местом для существования этой логики (в противном случае любое другое место, которое вызывает метод newsletter, также должно будет проверить флаг subscribed.

1 Ответ

1 голос
/ 10 мая 2011

Почтовик, ИМХО, является неподходящим местом для этой логики.Почтовик не должен делать ничего, кроме форматирования и отправки сообщений.Логика для принятия решения о том, отправлять или нет, должна находиться в вызывающем блоке кода.Это не правильный путь, но что-то такое простое, как:

UserMailer.newsletter(user).deliver if user.subscribed?

В качестве альтернативы, как вы упомянули, вам не нужно перебирать всех пользователей, только подписанных.То есть с scope в модели User, называемой subscribed:

User.subscribed.each do |user|
  UserMailer.newsletter(user).deliver
end

Таким образом, вам не нужно тестировать для каждого пользователя;включены только подписанные пользователи, и логика находится в вызывающем блоке, а не в почтовой программе.

...