1

我正在尝试使用他们的ApplicationMailer机制从 Ruby on Rails v4.2 发送电子邮件。不幸的是,至少在开发环境控制台中,ApplicationMailer我们创建的子类没有调用我们试图调用的方法:

class RecurringScheduleNotifier < ApplicationMailer
  default from: 'notifications@example.com'
  def send_schedule_reminder(student)
    logger.debug('This never gets called :(')
    send_schedule_reminder_email(student, student.email).deliver
  end
  def send_schedule_reminder_email(user, email)
    mail(to: email, subject: 'Test subject')
  end
end

class Student < ActiveRecord::Base
  def self.send_emails
    Student.all.each do |student|
      logger.debug('This does get called')
      RecurringScheduleNotifier.send_schedule_reminder(student)
      logger.debug('This also get called')
    end
  end
end

如果我直接在控制台中运行邮件程序,它会很好地发送电子邮件:

RecurringScheduleNotifier.send_schedule_reminder(Student.first)

所有 3 条记录器消息均按预期输出并发送电子邮件。但是,如果我从控制台调用Student类方法,这不起作用:

Student.send_emails

我没有收到错误消息,但只Student输出了类中的 2 条记录器消息。中的记录器消息RecurringScheduleNotifier根本不输出!

我错过了什么?这很奇怪,因为Student.send_emails真正要做的就是调用RecurringScheduleNotifier.send_schedule_reminder每个学生(现在我的开发环境中只有 1 个)。直接打电话RecurringScheduleNotifier.send_schedule_reminder给那个学生效果很好。

4

2 回答 2

2

当您调用 mailer 方法时,该方法返回一个 ActionMailer::MessageDelivery. 你必须打电话deliver_nowdeliver_later发送电子邮件。

因此,在您的情况下,在您的用户模型中,调用...

RecurringScheduleNotifier.send_schedule_reminder(student).deliver_later

......应该做的伎俩。

不过,我不确定您的邮件中有两种方法。您可能希望将它们合并为一个。喜欢:

def send_schedule_reminder(student)
  @student = student
  logger.debug('This never gets called :(')
  mail(to: student.email, subject: 'Test subject')
end
于 2015-02-10T21:10:35.587 回答
1

为了补充Johann的评论,ActionMailer::Base该类有一种特殊的方式来调用他们所有的实例方法作为类方法这里是源代码。我不知道这是为什么,只要我看到只有这个类实现了这个“模式”(¿?)。

于 2017-08-07T15:58:23.863 回答