You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:30:05