首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >像使用类方法一样使用ActionMailer实例方法

像使用类方法一样使用ActionMailer实例方法
EN

Stack Overflow用户
提问于 2011-06-16 14:26:52
回答 1查看 1.9K关注 0票数 16

下面是ActionMailer指南中的一个简短片段

代码语言:javascript
复制
    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

在控制器中

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

发布于 2011-06-16 14:48:37

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

快速浏览一下源代码,你是对的,它似乎确实使用了method_missing,其中邮件程序实际上是用以下命令创建的:

邮件= TheMailer.new(:welcome_email,*args)

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6367921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档