Rake mailer 任务只向最后一个订阅者发送时事通讯

Rake mailer task only sends newsletter to last subscriber

昨晚我发现我的 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

这就是我在 NewsletterMailer 中定义 weekly_best 的方式:

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 <hi@greatwavelengths.com>", subject: "Weekly best gear")
  end
end

如您所见,我确实遍历了订阅者的所有电子邮件地址,但为什么不将其发送给所有人?

希望大家帮忙:)

方法 NewsletterMailer.weekly_best 将 return 仅来自您的 @subscriptions.each 循环的最后一封电子邮件。然后你在这一封电子邮件上调用 deliver,这就是为什么只发送一封电子邮件的原因。

要修复它,您需要分别对每封邮件调用 deliver。你可以这样做:

class NewsletterMailer
  def self.deliver_weekly_best
    subscriptions = NewsletterSubscription.where(active: true)
    plugins = Plugin.where(...)

    # Call deliver for each subscription   
    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