调用ActionMailer子类方法返回意外NullMail对象问题求助
问题根因
- 你定义的
unapproved_remind_mail是实例方法,但你在类方法self.send_unapproved_remind_mails中直接调用该方法时,相当于尝试调用同名类方法,ActionMailer对不存在的邮件类方法会默认返回NullMail对象,不会直接抛出方法不存在的报错。 - 即使你正常实例化调用,ActionMailer的实例方法默认也会拦截返回值,优先返回邮件对象,不会直接返回你代码中写的JSON字符串。
修复方案
根据你的使用场景二选一即可:
方案1:调整为类私有方法(仅作为JSON生成工具方法使用)
如果该方法不需要作为独立的邮件发送入口,仅用来生成JSON,可以直接调整为类私有方法,就能直接在类方法中调用:
class Workflow::Mailer < ActionMailer::Base def self.send_unapproved_remind_mails(args) args = args.dup sm_body = unapproved_remind_mail(args) Rails.logger.fatal("sm_body: #{sm_body}") end # 类私有方法作用域 class << self private def unapproved_remind_mail(args) # 此处可正常调用其他类私有方法 [ { "uid": "1060_424652", "noticecd": "A002", "ref_url": "", "title": "", "content": "" }, { "uid": "1060_403595", "noticecd": "A002", "ref_url": "", "title": "", "content": "" } ].to_json end end end
方案2:保留为实例方法(需要同时作为邮件发送方法)
如果该方法还要用来发送邮件,或者你需要调用的私有方法是实例方法,可以先实例化对象再调用方法,绕过ActionMailer的返回值拦截:
class Workflow::Mailer < ActionMailer::Base def unapproved_remind_mail(args) # 此处可正常调用私有实例方法 json_str = [ { "uid": "1060_424652", "noticecd": "A002", "ref_url": "", "title": "", "content": "" }, { "uid": "1060_403595", "noticecd": "A002", "ref_url": "", "title": "", "content": "" } ].to_json # 如果需要该方法支持正常发邮件,保留下方mail调用即可,不需要可以删除 # mail(to: "收件人邮箱", subject: "待审批提醒") json_str end def self.send_unapproved_remind_mails(args) args = args.dup # 先实例化,再调用实例方法获取实际返回值 sm_body = new.send(:unapproved_remind_mail, args) Rails.logger.fatal("sm_body: #{sm_body}") end private # 你的其他私有实例方法 def your_custom_private_method # 自定义逻辑 end end
内容的提问来源于stack exchange,提问作者UMR
相关产品推荐
相关产品推荐

