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