Ruby on rails ActionMailer实例方法与类方法一样使用

Ruby on rails ActionMailer实例方法与类方法一样使用,ruby-on-rails,ruby,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, :subje

下面是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 UserMailer”notifications@example.com"
def欢迎电子邮件(用户)
@用户=用户
@url=”http://example.com/login"
邮件(:to=>user.email,
:subject=>“欢迎访问我的精彩网站”)
结束
结束
在控制器中

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
class UsersController“用户已成功创建”)}
format.xml{render:xml=>@user,:status=>:created,:location=>@user}
其他的
format.html{render:action=>“new”}
format.xml{render:xml=>@user.errors,:status=>:unprocessable_entity}
结束
结束
结束
结束
那么,为什么Rails试图将rubyist与实例方法混淆为类方法呢?我假设他们已经覆盖了缺少的方法,但这只会让人困惑!还是我在这里遗漏了什么

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

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

通过快速查看源代码,您是对的,它似乎确实使用了
方法\u missing
,其中邮件程序实际上是使用以下内容创建的:

mailer=TheMailer.new(:welcome\u email,*args)


Rails做了很多类似这样的“巫毒”事情,通常只是为了节省编写的代码量。仅仅将
#welcome_email
更改为类方法不会给您提供实例。

那么rails在调用邮件程序时应该继续在方法名称前面加上“create”或“deliver”。反对那些(Rails3)支持疯狂vudoo只会让疯狂的vudoo开发者认为他们了解ruby,但他们真的不知道你有什么问题,或者只是想表达你的观点?;)似乎你用一个反问句创造了一个主题,你不应该这样做,而且很可能会结束。这是一个问题——但基于它的“巫术”而不是一些真正的逻辑原因的答案——我想它看起来确实无关紧要。