0

ファイル app/mailers/user_mailer.rb に次のコードがあります。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
4

2 に答える 2

1

おっしゃる通り、ActionMailer はコントローラーではありません (それが ActionController です)。respond_toActionController のメソッド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ビュー フォルダーでそのタイプに一致するテンプレートを探して、実際に電子メールを作成します。

于 2013-05-19T16:00:07.287 に答える
0

メーラーはコントローラーに似ていますが、ActionController を継承していないため、メーラーの場合はビューを配置しますapp/views/user_mailer/SIGNUP_NOTIFICATION.html.erb

そして、メーラーでメソッドを呼び出してこのメ​​ールを送信できます。

UserMailer.SIGNUP_NOTIFICATION(some_user_instance).deliver

これがあなたが求めているものかどうかわかりません。

于 2013-05-19T16:01:53.303 に答える