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

Sye*_*Ali 16 ruby ruby-on-rails

以下是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
Run Code Online (Sandbox Code Playgroud)

并在控制器中

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
Run Code Online (Sandbox Code Playgroud)

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

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

d11*_*wtq 5

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

从快速查看源代码,你是对的,它似乎确实使用method_missing,邮件实际创建的地方:

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

Rails做了很多这样的"伏都教"事情,通常只是为了节省你编写的代码量.只是更改#welcome_email为类方法不会给你一个实例.

  • 那么在调用邮件程序时,rails应继续在方法名称前加上"create"或"deliver".弃用那些(Rails3)而不是疯狂的vudoo就是要创造疯狂的vudoo开发者,他们认为他们知道ruby,但他们真的不喜欢 (3认同)