我试图从Ruby on Rails v4.2使用其ApplicationMailer
机制发送电子邮件。不幸的是,至少在开发环境控制台中,ApplicationMailer
我们创建不调用该方法的子类,我们试图调用:Rails ApplicationMailer方法调用时未调用
class RecurringScheduleNotifier < ApplicationMailer
default from: '[email protected]'
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
,该学生的作品完美。
'deliver'函数显然不是这里的问题,尽管...因为第一个'logger'调用永远不会被调用。 – 2015-02-11 01:33:11
@桑德似乎是正确的。我刚遇到同样的问题。用户定义的动作邮件程序的子类不会在调用“.deliver_now”或“.deliver_later”后调用。请注意,当你定义你的邮件程序的方法时,你定义了_instance_方法,但是在你的代码中你调用了_class_方法,所以这里包含了一些Rails魔法,这是一种懒惰的评估。 – Johann 2015-03-25 17:24:00