10

Rails でメールを送信する場合、通常は次のようにします。

UserMailer.password_reset(user).deliver

しかし、内部UserMailerを見ると、次のことがわかります。

def password_reset(user) # not self.password_reset
  # ...
end

メソッド名に接頭辞が付いていないことに注意してくださいself。それを見ると、以下のように最初にオブジェクトをインスタンス化する必要があるようです。Railsはこれをどのように行うのですか?

UserMailer.new.password_reset(user).deliver
4

2 に答える 2

12

それは素晴らしい質問です。ソース ( https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb ) では、Rails は method_missing を使用して ActionMailer の新しいインスタンスを作成します。ソースからの関連する抜粋は次のとおりです。

def method_missing(method_name, *args) # :nodoc:
  if respond_to?(method_name)
    new(method_name, *args).message
  else
    super
  end
end
于 2013-06-13T14:46:44.467 に答える