你说得对
sample_email
不是类方法,而是实例方法。但是
ExampleMailer
继承自
ActionMailer::Base
这做了一些聪明的元编程。
当你打电话的时候
ExampleMailer.simple_email
它找不到类方法,因此会自动调用私有方法
method_missing
.
在里面
缺少方法\u
它检查实例方法是否存在,创建一个mailer实例对象(因此它基本上执行
.new
,调用mailer对象上的instance方法,然后返回该对象。。。在那个物体上,你调用了
deliver_now
或
deliver_later
方法,因为您在原始行中指定了这些方法。基本上和你做的一样。。。
my_mail_thing = ExampleMailer.sample_email(@user)
my_mail_thing.deliver_now
但是,如果ExampleMailer找不到实例方法,它会使用标准的缺失响应,例如,ExampleMail的“NoMetihodError::undefined method‘another\u simple\u email’:Class”
这一切都很神奇。您可以阅读更多关于
缺少方法\u
通过谷歌搜索这个术语,你可以在自己的课堂上进行实验。