了解Rails ActionMailer编码

时间:2017-12-15 11:10:57

标签: ruby-on-rails ruby actionmailer

我对ActionMailer编码感到有点困惑。

标准动作邮件程序示例

应用/邮寄者/ example_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

应用/控制器/ users_controller.rb

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
  1. ExampleMailer如何在没有sample_email的情况下访问ExampleMailer.new方法? sample_email不是类方法!

  2. deliver_now如何致电ExampleMailer

  3. 我希望很清楚。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

你是对的sample_email不是一种类方法,它是一种实例方法。但ExampleMailer继承自ActionMailer::Base,它做了一些聪明的元编程。

当您致电ExampleMailer.simple_email时,它找不到类方法,因此会自动调用私有方法method_missing

method_missing中,它检查实例方法是否存在,创建一个邮件程序实例对象(因此它基本上为你做.new),调用邮件程序对象上的实例方法,然后返回对象...并且在该对象上,您调用了deliver_nowdeliver_later方法,因为您在原始行中指定了这些方法。基本上和你做的一样......

my_mail_thing = ExampleMailer.sample_email(@user)
my_mail_thing.deliver_now

但是,如果ExampleMailer没有找到实例方法,那么它会依赖于标准的缺失响应,例如&#34; NoMetihodError :: undefined method&#39; another_simple_email&#39;对于ExampleMail.:Class"

这一切都非常棒。您可以通过Google搜索该术语来详细了解method_missing。您可以在自己的课程上进行实验。