关于ruby类方法的调用

时间:2010-12-17 06:08:02

标签: ruby-on-rails ruby ruby-on-rails-3

在rails3中我定义了一个类

#coding:utf-8
class CoreMail < ActionMailer::Base
  def consulting_reply(email)
    mail(:to => email, :subject => 'ssss')

  end



end

我发现我可以像这样调用这个方法

CoreMail.consulting_reply(email)

但我希望我认为正确的方法是:

instance=CoreMail.new
instance.consulting_reply(email)

因为consulting_reply是实例方法,

我错过了什么吗?希望有人能给我一个帮助

2 个答案:

答案 0 :(得分:2)

ActionMailer::Base上定义了method_missing

def method_missing(method, *args) #:nodoc:
  return super unless respond_to?(method)
  new(method, *args).message
end

这将使用相同的参数调用您的实例方法,然后调用message方法,返回该邮件程序调用的对象。要发送它,请在方法调用结束时调用deliver!

CoreMail.consulting_reply(email).deliver!

答案 1 :(得分:0)

你是对的,通常这将是一个实例方法,你必须在调用consulting_reply()之前创建一个类的实例(因为它没有被定义为self.consulting_reply)。但是,你的类继承自ActionMailer :: Base,并且在幕后发生了一些ruby魔术。检查ActionMailer :: Base的源代码以便自己查看(https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb),但为了简化您的操作,这里是一个简单的例子:

class Test
  def self.method_missing(method, *args)
    puts "Called by a non class method"
  end
end

Test.fake_class_method

将输出:

由非类方法调用

ActionMailer :: Base执行与此类似的操作,它会动态查找您调用的方法。我相信它也会使用以下方法创建类的实例:

new(method, *args).message

无论如何,我希望这能说明发生了什么。

相关问题