私有方法`new'调用MyReminderMailer:Class

use*_*412 3 ruby actionmailer

在控制器中,我有:

mailer = MyReminderMailer.new
Run Code Online (Sandbox Code Playgroud)

邮件看起来像这样:

class MyReminderMailer < ActionMailer::Base
  def change_email
    mail(
      from:     default_from,
      to:       default_to,
      subject: "..."
    )
  end

  def default_from
    return '...'
  end

  def default_to
    return '...'
  end
end
Run Code Online (Sandbox Code Playgroud)

但得到错误:私有方法`new'调用MyReminderMailer:Class

Zac*_*emp 12

ActionMailer::Base有一个相当愚蠢和不直观的API.与控制器非常相似,您从不显式创建邮件程序的实例.相反,您将它们作为类与它们进行交互.new被标记为私有ActionMailer::Base,并且类的方法调用随后被路由到它method_missing自己的新实例.就像我说的那样,不直观.

有关正确使用ActionMailer的更多信息,请查看指南api文档.

  • "愚蠢和不直观"是慈善事业,我可能会使用强大的语言:) (5认同)

小智 5

Ruby 不允许以正常方式调用私有方法。您可以使用发送方法调用它

SomeClass.send :method_name

#in your case
MyReminderMailer.send :new
Run Code Online (Sandbox Code Playgroud)

而且您不需要 ActionMailer 对象。要发送邮件,只需像类方法一样使用该方法。

MyReminderMailer.change_email.deliver
Run Code Online (Sandbox Code Playgroud)

希望这可以帮到你。