2011-05-10 40 views
0

我试图实现一个ActionMailer函数,它会发送一封简报给特定的用户。我想确保通讯只发送给订阅用户。我试图实现它,像这样:如何退出ActionMailer :: Base功能?

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标志以及。

回答

2

梅勒,恕我直言,是错误的地方邮件应该只是格式化和发送信息,决定是否发送的逻辑应该位于代码的调用块中,这不是正确的方式,而是如此简单:

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

另外,正如你所提到的,你不应该遍历所有的用户,只需要订阅。所以在的User mod埃尔称为subscribed

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

这样,您就不需要测试在每个用户的基础;只包含订阅的用户,逻辑位于调用块中,而不在邮件程序中。