Rails ActionMailer方法混乱

时间:2010-10-17 13:02:45

标签: ruby-on-rails authlogic actionmailer

我使用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_位。

所以这里发生了什么?怎么一切都有效?

2 个答案:

答案 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类的实例,调用您的方法并传递电子邮件对象。