Ruby on rails 理解Rails ActionMailer编码

Ruby on rails 理解Rails ActionMailer编码,ruby-on-rails,ruby,actionmailer,Ruby On Rails,Ruby,Actionmailer,我对ActionMailer编码有点困惑 一个标准的ActionMailer示例 app/mailers/example\u mailer.rb class ExampleMailer < ActionMailer::Base default from: "from@example.com" def sample_email(user) @user = user mail(to: @user.email, subject: 'Sample Email') en

我对ActionMailer编码有点困惑

一个标准的ActionMailer示例

app/mailers/example\u mailer.rb

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

  def sample_email(user)
    @user = user
    mail(to: @user.email, subject: 'Sample Email')
  end
end
def create
  @user = User.new(user_params)

  respond_to do |format|
    if @user.save

      # Sends email to user when user is created.
      ExampleMailer.sample_email(@user).deliver_now

      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render :show, status: :created, location: @user }
    else
      format.html { render :new }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end
我的问题与

ExampleMailer.sample_email(@user).deliver_now
  • 如何使用
    ExampleMailer
    访问
    sample\u email
    方法而不使用
    ExampleMailer.new
    <代码>示例\u电子邮件不是类方法

  • 如何
    立即投递
    呼叫
    示例邮递员


  • 我希望这是清楚的。感谢您的帮助。

    您是对的,
    sample\u email
    不是类方法,而是实例方法。但是
    ExampleMailer
    继承了
    ActionMailer::Base
    ,它做了一些巧妙的元编程

    调用
    ExampleMailer.simple\u email
    时,它找不到类方法,因此会自动调用私有方法
    method\u missing

    method\u missing
    中,它检查实例方法是否存在,创建一个mailer实例对象(因此它基本上为您执行
    .new
    ),调用mailer对象上的实例方法,然后返回对象。。。在该对象上,您调用了
    deliver\u now
    deliver\u later
    方法,因为您在原始行中指定了这些方法。基本上和你做的一样

    my_mail_thing = ExampleMailer.sample_email(@user)
    my_mail_thing.deliver_now
    
    但是,如果ExampleMailer找不到实例方法,它会返回标准的缺失响应,例如“NoMetihodError::undefined method‘other_simple_email’(例如邮件)::Class”

    这真是太神奇了。通过谷歌搜索这个术语,你可以阅读更多关于
    method\u missing
    ,你还可以在自己的类上进行实验