Ruby on Rails中的实例和类方法

时间:2012-08-17 20:22:42

标签: ruby-on-rails-3.2

最近我在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#中的静态方法),它是实例方法!

1 个答案:

答案 0 :(得分:2)

这有点棘手。

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

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

如果检查AbstractController::Base,您可以看到抽象类的位置,并将操作方法​​转换为公共实例方法。