2011-05-10 71 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 

這樣,您就不需要測試在每個用戶的基礎;只包含訂閱的用戶,邏輯位於調用塊中,而不在郵件程序中。