你說得對,ActionMailer不是控制器(即ActionController)。的ActionController的respond_to
方法的ActionMailer的mail
方法是完全不同的東西,但它們都具有「什麼樣的反應,我們應該送」等鐵軌開發者選擇提供格式都選擇一個類似的界面概念。
在ActionController中,respond_to
方法佔用一個塊並使用HTTP請求環境來選擇要呈現的格式。
在的ActionMailer,mail
需要一個塊,並使用不同的邏輯來決定來渲染的格式。當您給它format.html
時,它只會在您的視圖文件夾中查找<method_name>.<format>.<acceptable_template_type>
的模板,例如SIGNUP_NOTIFICATION.html.erb。順便說一句,你應該在snake_case(signup_notification)中命名所有的方法。大寫方法名稱是非慣用的,可能會導致問題。
技術解釋
雖然你不需要知道這使用的ActionMailer,我認爲這是有趣通過模板生成如何工作在這裏流走。它包含一些有趣的元編程,但邏輯比常規控制器(無HTTP環境)簡單。
您可以在它調用a function to render the messages的source for mail看到。如果您給mail
一個塊,郵件會創建一個ActionMailer::Collector(其中包括AbstractController :: Collector)的實例並生成該收集器。所以,在你的榜樣收集得到調用它的功能html
(因爲你的do |format| ... end
有一個說法,format
將收集實例時yield(collector)
被稱爲here。
所以的ActionMailer ::收集器的實例被傳遞到您的do |format| ...
塊,它具有對其調用的功能html
,收集器使用AbstractController :: Collector中的method missing tricks ,以便它可以響應任何MIME類型,將所請求的類型傳遞給ActionMailler::Collector#custom
,該類型通過查看視圖實際構建電子郵件文件夾匹配類型模板。