正如类方法一样使用ActionMailer实例方法

时间:2011-06-16 06:26:52

标签: ruby-on-rails ruby

以下是ActionMailer指南的简要摘录

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

  def welcome_email(user)
    @user = user
    @url  = "http://example.com/login"
    mail(:to => user.email,
         :subject => "Welcome to My Awesome Site")
  end

end

在控制器中

class UsersController < ApplicationController
  # POST /users
  # POST /users.xml
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        # Tell the UserMailer to send a welcome Email after save
        UserMailer.welcome_email(@user).deliver

        format.html { redirect_to(@user, :notice => 'User was successfully created.') }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
end

那么为什么Rails试图将rubyist与实例方法混淆为类方法呢?我认为他们已经覆盖了丢失的方法,但它只会让人感到困惑!或者我在这里遗漏了什么?

即为什么不将welcome_email定义为def self .welcome_email(user)

1 个答案:

答案 0 :(得分:5)

如果它是#self.welcome_email你必须自己创建一个类的实例,这需要对所有默认参数进行一些配置等.Rails只提供同名的工厂方法。

通过快速查看源代码,您是对的,它似乎确实使用method_missing,其中邮件实际上是通过以下方式创建的:

mailer = TheMailer.new(:welcome_email,* args)

Rails做了很多像这样的“伏都教”事情,通常只是为了节省你编写的代码量。只需将#welcome_email更改为类方法就不会为您提供实例。