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

Mailer、IMHOは間違った場所ですメッセージを送信するかどうかを決定するロジックは、呼び出し元のコードブロック内にある必要があります。適切な方法ではありませんが、次のような単純なものです:

あなたが言及したように、登録したばかりのすべてのユーザーに対して繰り返し処理を行う必要はありません。したがって、User modのscopeエルはsubscribedと呼ばれる:

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

あなたは、ユーザーごとにテストする必要はありません。この方法は、サブスクライブされたユーザーのみが含まれ、ロジックはメーラーではなく呼び出しブロックにあります。

関連する問題