【问题标题】:Rake mailer task only sends newsletter to last subscriberRake mailer 任务仅向最后一个订阅者发送时事通讯
【发布时间】:2019-12-22 09:07:02
【问题描述】:

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

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

希望大家帮忙:)

【问题讨论】:

    标签: ruby-on-rails heroku rake mailer


    【解决方案1】:

    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 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
    

    【讨论】:

    • 抱歉,延迟回复,圣诞节来了。是的,成功了,非常感谢!
    猜你喜欢
    • 2019-12-16
    • 2012-12-14
    • 2016-02-18
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2017-02-09
    • 2015-08-25
    • 2012-02-21
    相关资源
    最近更新 更多