我尝试使用他们的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
可以很好地运作。
答案 0 :(得分:2)
当您调用邮件程序方法时,该方法返回ActionMailer::MessageDelivery
。您必须致电deliver_now
或deliver_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。我不知道为什么这个,只要我看到只有这个类实现了这个“模式”(¿?)。