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)
如果是,#self.welcome_email你必须自己创建一个类的实例,这需要对所有默认参数进行一些配置等.Rails只提供同名的工厂方法.
从快速查看源代码,你是对的,它似乎确实使用method_missing,邮件实际创建的地方:
mailer = TheMailer.new(:welcome_email,*args)
Rails做了很多这样的"伏都教"事情,通常只是为了节省你编写的代码量.只是更改#welcome_email为类方法不会给你一个实例.
| 归档时间: |
|
| 查看次数: |
1821 次 |
| 最近记录: |