下面是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和实例方法混淆为类方法呢?我假设他们已经覆盖了缺失的方法,但这只会让人感到困惑!还是我错过了什么?
ie为什么不将welcome_email定义为def self.welcome_email(user)
发布于 2011-06-16 14:48:37
如果是#self.welcome_email
,你必须自己创建一个类的实例,这需要对所有的默认参数等进行一些配置。Rails只是提供了同名的工厂方法。
快速浏览一下源代码,你是对的,它似乎确实使用了method_missing
,其中邮件程序实际上是用以下命令创建的:
邮件= TheMailer.new(:welcome_email,*args)
Rails做了很多类似这样的“巫毒”的事情,通常只是为了节省您编写的代码量。仅仅将#welcome_email
更改为一个类方法并不会得到一个实例。
https://stackoverflow.com/questions/6367921
复制相似问题