0

最近我在 Ruby on Rails http://railscasts.com/episodes/206-action-mailer-in-rails-3中看到一个很奇怪的代码

   class UserMailer < ActionMailer::Base
      default :from => "ryan@railscasts.com"

      def registration_confirmation(user)
        @user = user
        attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png")
        mail(:to => "#{user.name} <#{user.email}>", :subject => "Registered")
      end
    end

    #controller
    UserMailer.registration_confirmation(@user).deliver

这怎么可能?registration_confirmation不是类方法(或有点像 C# 中的静态方法),它是一个实例方法!

4

1 回答 1

2

这有点棘手。

因为它派生自 AbstractController,所以定义的方法被添加为公共实例方法。(http://api.rubyonrails.org/classes/ActionMailer/Base.html)

您永远不会实例化您的邮件程序类。相反,您只需调用您在类本身上定义的方法。

如果您检查AbstractController::Base,您可以看到类在哪里被抽象,并且操作方法被转换为公共实例方法。

于 2012-08-17T21:00:38.523 回答