我使用authlogic实现了一个身份验证系统,并根据本教程添加了密码重置功能http://github.com/rejeep/authlogic-password-reset-tutorial
这一切都有效,但我很困惑为什么会这样做..
有这个代码..
class User < ActiveRecord::Base
def deliver_password_reset_instructions!
reset_perishable_token!
Notifier.deliver_password_reset_instructions(self)
end
end
和这个
class Notifier < ActionMailer::Base
def password_reset_instructions(user)
subject "Password Reset Instructions"
from "noreplay@domain.com"
recipients user.email
content_type "text/html"
sent_on Time.now
body :edit_password_reset_url => edit_password_reset_url(user.perishable_token)
end
end
这条线让我困惑
Notifier.deliver_password_reset_instructions(self)
因为Notifier类中的方法被称为
password_reset_instructions
没有deliver_
位。
所以这里发生了什么?怎么一切都有效?
答案 0 :(得分:3)
很好的问题,很多人忘了问这些问题。
您是否注意到,您从未真正实例化过邮件类对象。您的邮件程序类方法通常包含此 deliver_<method_name>
所以内部在ruby中使用method_missing
的概念。假设您在该对象不存在的ruby中调用某个方法,ruby调用method_missing
方法。这是在“ActionMailer :: Base”代码中定义的
def method_missing(method_symbol, *parameters)#:nodoc: case method_symbol.id2name when /^create_([_a-z]\w*)/ then new($1, *parameters).mail when /^deliver_([_a-z]\w*)/ then new($1, *parameters).deliver! when "new" then nil else super end end
因此,如果方法匹配“deliver_”和小写字母的任意组合,Rails将实例化您的Mailer类(通过调用“new”)并将其与参数一起发送到初始化程序并调用“deliver!”最终传递邮件的方法。
“create_&lt; method_name&gt;”也是如此类型方法
答案 1 :(得分:1)
这是Rails 2 ActionMailer约定。
要发送电子邮件,请使用YourMailerClass.deliver_NAME_OF_THE_METHOD
。
要初始化电子邮件,请使用YourMailerClass.create_NAME_OF_THE_METHOD
。
Rails将自动创建Mailer类的实例,调用您的方法并传递电子邮件对象。