0

这是最近 Railscast 中的一些代码:

class UserMailer < ActionMailer::Base
  default from: "from@example.com"

  def password_reset(user)
    @user = user
    mail :to => user.email, :subject => "Password Reset"
  end
end

这是在控制器中

def create
  user = User.find_by_email(params[:email])
  UserMailer.password_reset(user).deliver
  redirect_to :root, :notice => "Email sent with password reset instructions."
end

password_reset方法对我来说看起来像一个实例方法,但它看起来像一个类方法一样被调用。是实例还是类方法,还是这个类有什么特别之处UserMailer

4

1 回答 1

2

查看源代码 ( 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-09-29T11:36:33.037 回答