2010-10-17 85 views
3

我實現了一個認證系統使用authlogic,並增加密碼重置功能按照本教程http://github.com/rejeep/authlogic-password-reset-tutorial的Rails的ActionMailer方法混亂

它所有的作品,但我很困惑,爲什麼它..

有是這個代碼..

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   "[email protected]" 
    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) 

在通告類的方法被稱爲

password_reset_instructions 

沒有deliver_位。

那麼這裏發生了什麼?這一切如何發揮作用?

回答

3

偉大的問題,很多人忘了問這些問題。

你注意到,你從來沒有真正實例化你的郵件類對象。你的郵件類的方法通常用這個deliver_<method_name>

所以在內部這使用紅寶石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的實例您梅勒類(通過調用「新」),併發送它與參數初始化並調用「交付!」方法來最終發送郵件。

同去的「CREATE_ <METHOD_NAME>」式的方法

+0

非常感謝您詳細的解釋,這是有道理的現在。 – pingu 2010-10-17 18:08:53

1

這是Rails 2 ActionMailer約定。

要發送電子郵件,請使用YourMailerClass.deliver_NAME_OF_THE_METHOD。 要初始化電子郵件,請使用YourMailerClass.create_NAME_OF_THE_METHOD

Rails會自動創建一個Mailer類的實例,調用你的方法並傳遞email對象。