在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是实例方法,
我错过了什么吗?希望有人能给我一个帮助
答案 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
无论如何,我希望这能说明发生了什么。