Ruby on rails 如何从ActionMailer::Base函数中返回?

Ruby on rails 如何从ActionMailer::Base函数中返回?,ruby-on-rails,actionmailer,Ruby On Rails,Actionmailer,我正在尝试实现一个ActionMailer功能,它将向特定用户发送新闻稿。我想确保新闻稿只发送给订阅的用户。我试着这样实现它: class UserMailer < ActionMailer::Base def newsletter(user) return unless user.subscribed # This still renders my mailer view mail(:to => user.email, :subject => "News

我正在尝试实现一个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

请注意,出于性能原因,我在cron作业中也有该订阅逻辑(不应该迭代所有用户,只迭代那些已订阅的用户)。然而,感觉UserMailer类是这个逻辑存在的正确位置(否则,调用
新闻通讯
方法的任何其他位置也需要检查
subscribed
标志。

邮件发送程序IMHO是此逻辑的错误位置。邮件发送程序除了格式化和发送消息外,不应执行任何操作。决定是否发送的逻辑应该在调用代码块内。它不是这不是正确的方法,但简单到:

UserMailer.newsletter(user).deliver if user.subscribed?
或者,正如您所提到的,您不必迭代所有用户,只需迭代订阅的用户。因此,在名为
subscribed
User
模型中使用
scope

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

这样,您就不需要对每个用户进行测试;只包括已订阅的用户,并且逻辑在调用块中,而不是在邮件程序中。

邮件程序IMHO是此逻辑的错误位置。邮件程序只需格式化和发送消息。决定是否发送的逻辑应该在调用块中这不是正确的方法,但很简单:

UserMailer.newsletter(user).deliver if user.subscribed?
或者,正如您所提到的,您不必迭代所有用户,只需迭代订阅的用户。因此,在名为
subscribed
User
模型中使用
scope

User.subscribed.each do |user|
  UserMailer.newsletter(user).deliver
end
这样,您不需要基于每个用户进行测试;只包括订阅的用户,并且逻辑在调用块中,而不在邮件程序中