昨晚,我发现我的rake mailer任务发送了我的时事通讯,仅将其发送给最后一个订阅者。但为什么?!我使用Heroku Scheduler执行任务。
这是我在scheduler.rake
中的代码:
desc "This task is called by the Heroku scheduler add-on"
task :send_newsletter => :environment do
if Time.now.saturday?
NewsletterMailer.weekly_best.deliver
end
end
这就是我在weekly_best
中定义NewsletterMailer
的方式:
def weekly_best
@subscriptions = NewsletterSubscription.where(active: true)
@plugins = Plugin.where("created_at >= ?", Date.today.beginning_of_week).where("cached_votes_up > ?", 0).order(:cached_votes_up => :desc).first(5)
@subscriptions.each do |s|
mail(to: s.email, from: "Great Wavelengths <[email protected]>", subject: "Weekly best gear")
end
end
您可以看到我确实遍历了订阅的所有电子邮件地址,但是为什么它不将其发送给所有人?
希望你们能提供帮助:)
NewsletterMailer.weekly_best
方法将仅返回@subscriptions.each
循环中的最后一封电子邮件。然后您在这一封电子邮件中呼叫deliver
,这就是为什么只发送一封电子邮件的原因。
要解决此问题,您需要分别在每个邮件上调用deliver
。您可以执行以下操作:
class NewsletterMailer
def self.deliver_weekly_best
subscriptions = NewsletterSubscription.where(active: true)
plugins = Plugin.where(...)
# Call deliver for each subscriber
subscriptions.each { |sub| weekly_best(sub, plugins).deliver }
end
def weekly_best(sub, plugins)
@plugins = plugins
mail(to: sub.email, ...)
end
end
然后按照您的时间表去做:
NewsletterMailer.deliver_weekly_best