调用时未调用Rails ApplicationMailer方法

时间:2015-02-10 20:53:57

标签: ruby-on-rails ruby ruby-on-rails-4 actionmailer ruby-on-rails-4.2

我尝试使用他们的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可以很好地运作。

2 个答案:

答案 0 :(得分:2)

当您调用邮件程序方法时,该方法返回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

答案 1 :(得分:1)

为了补充Johann的评论,ActionMailer::Base类有这种特殊的方式将所有的实例方法称为类方法here is the source code。我不知道为什么这个,只要我看到只有这个类实现了这个“模式”(¿?)。