我对ActionMailer编码感到有点困惑。
标准动作邮件程序示例
应用/邮寄者/ example_mailer.rb
class ExampleMailer < ActionMailer::Base
default from: "from@example.com"
def sample_email(user)
@user = user
mail(to: @user.email, subject: 'Sample Email')
end
end
应用/控制器/ users_controller.rb
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
# Sends email to user when user is created.
ExampleMailer.sample_email(@user).deliver_now
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
我的问题与
有关ExampleMailer.sample_email(@user).deliver_now
ExampleMailer
如何在没有sample_email
的情况下访问ExampleMailer.new
方法? sample_email
不是类方法!
deliver_now
如何致电ExampleMailer
?
我希望很清楚。任何帮助表示赞赏。
答案 0 :(得分:1)
你是对的sample_email
不是一种类方法,它是一种实例方法。但ExampleMailer
继承自ActionMailer::Base
,它做了一些聪明的元编程。
当您致电ExampleMailer.simple_email
时,它找不到类方法,因此会自动调用私有方法method_missing
。
在method_missing
中,它检查实例方法是否存在,创建一个邮件程序实例对象(因此它基本上为你做.new
),调用邮件程序对象上的实例方法,然后返回对象...并且在该对象上,您调用了deliver_now
或deliver_later
方法,因为您在原始行中指定了这些方法。基本上和你做的一样......
my_mail_thing = ExampleMailer.sample_email(@user)
my_mail_thing.deliver_now
但是,如果ExampleMailer没有找到实例方法,那么它会依赖于标准的缺失响应,例如&#34; NoMetihodError :: undefined method&#39; another_simple_email&#39;对于ExampleMail.:Class"
这一切都非常棒。您可以通过Google搜索该术语来详细了解method_missing
。您可以在自己的课程上进行实验。