最近我在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#中的静态方法),它是实例方法!
答案 0 :(得分:2)
这有点棘手。
因为它派生自AbstractController,所以定义的方法作为公共实例方法添加。 (http://api.rubyonrails.org/classes/ActionMailer/Base.html)
您永远不会实例化您的邮件程序类。相反,您只需调用您在类本身上定义的方法。
如果检查AbstractController::Base,您可以看到抽象类的位置,并将操作方法转换为公共实例方法。