おっしゃる通り、ActionMailer はコントローラーではありません (それが ActionController です)。respond_to
ActionController のメソッドmail
と ActionMailer のメソッドはまったく別のものですが、どちらも「どのような応答を送信する必要があるか」という概念を持っているため、Rails 開発者は両方でフォーマットを選択するための同様のインターフェイスを提供することを選択しました。
ActionController では、respond_to
メソッドはブロックを受け取り、HTTP 要求環境を使用してレンダリングする形式を選択します。
ActionMailer ではmail
、ブロックを受け取り、さまざまなロジックを使用してレンダリングする形式を決定します。あなたがそれを与えるとformat.html
、あなたのviewsフォルダで<method_name>.<format>.<acceptable_template_type>
、たとえばSIGNUP_NOTIFICATION.html.erbなどのテンプレートを探します。余談ですが、snake_case (signup_notification) ですべてのメソッドに名前を付ける必要があります。大文字のメソッド名は慣用的ではなく、問題を引き起こす可能性があります。
技術説明
ActionMailer を使用するためにこれを知る必要はありませんが、ここでテンプレート生成がどのように機能するかの流れを見ていくのは興味深いと思います。いくつかの興味深いメタプログラミングが含まれていますが、ロジックは通常のコントローラー (HTTP 環境なし) よりも単純です。
メールのソースで、関数を呼び出してメッセージをレンダリングすることがわかります。mail
ブロックを指定すると、メールはActionMailer::Collector (AbstractController::Collector を含む) のインスタンスを作成し、このコレクターに譲ります。したがって、あなたの例では、コレクターはhtml
それに対して呼び出された関数を取得します(あなたdo |format| ... end
には引数があるため、ここで呼び出されたformat
ときにコレクターインスタンスになります.yield(collector)
do |format| ...
したがって、ActionMailer::Collector のインスタンスがブロックに渡され、そこで関数html
が呼び出されます。コレクターは、AbstractController::Collector のメソッドにないトリック
を使用して、任意の MIME タイプに応答できるようにし、要求されたタイプをActionMailler::Collector#custom
ビュー フォルダーでそのタイプに一致するテンプレートを探して、実際に電子メールを作成します。