1

我试图从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,该学生的作品完美。

回答

1

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

'deliver'函数显然不是这里的问题,尽管...因为第一个'logger'调用永远不会被调用。 – 2015-02-11 01:33:11

+0

@桑德似乎是正确的。我刚遇到同样的问题。用户定义的动作邮件程序的子类不会在调用“.deliver_now”或“.deliver_later”后调用。请注意,当你定义你的邮件程序的方法时,你定义了_instance_方法,但是在你的代码中你调用了_class_方法,所以这里包含了一些Rails魔法,这是一种懒惰的评估。 – Johann 2015-03-25 17:24:00

0

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