在控制器中,我有:
mailer = MyReminderMailer.new
邮件看起来像这样:
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
但得到错误:私有方法`new'为MyReminderMailer:Class
调用答案 0 :(得分:12)
ActionMailer::Base
有一个相当愚蠢且不直观的API。与控制器非常相似,您从不显式创建邮件程序的实例。相反,您将它们作为类与它们进行交互。 new
中的ActionMailer::Base
被标记为私有,并且该类的方法调用随后通过method_missing
路由到其自身的新实例。就像我说的那样,不直观。
答案 1 :(得分:3)
Ruby不允许以正常方式调用私有方法。 你可以用send方法调用它
SomeClass.send :method_name
#in your case
MyReminderMailer.send :new
而且你不需要ActionMailer对象。 要发送邮件,只需像使用类方法一样使用方法。
MyReminderMailer.change_email.deliver
希望这可以帮到你。