2013-05-19 44 views
0

我在文件app/mailers/user_mailer.rb中有以下一段代碼。 現在format.html如何知道要呈現什麼。 它不在任何控制器的操作中。 我明白它默認呈現show view的基本事實,但這裏沒有控制器沒有動作。 它是如何工作的?format.html如何知道要呈現什麼?

class UserMailer < ActionMailer::Base 
    def SIGNUP_NOTIFICATION(user) 
    @recipients = "#{user.email}" 
    @from = "#{sender.email}" 
    mailer_name = "SIGNUP_NOTIFICATION" 
    mail(:to => @recipients, :from => @from) do |format| 
     format.html 
    end 
    end 

回答

1

你說得對,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 messagessource 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,該類型通過查看視圖實際構建電子郵件文件夾匹配類型模板。

0

麥LER就像一個控制器,但沒有繼承的ActionController,爲您郵件,你會把你的觀點在app/views/user_mailer/SIGNUP_NOTIFICATION.html.erb

你可以發送該郵件調用你的郵件的方法:

UserMailer.SIGNUP_NOTIFICATION(some_user_instance).deliver 

我不知道,如果這是你要求的。

相關問題