2010-12-17 17 views
0

in rails3 iüber Ruby-Klasse Methode aufrufen

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

    end 



end 

fand ich eine Klasse definiert Ich mag dieses

CoreMail.consulting_reply(email) 

diese Methode aufrufen könnte, wollen aber dachte, dass ich der richtige Weg ist:

instance=CoreMail.new 
instance.consulting_reply(email) 

weil das consulting_reply die Instanzmethode ist,

habe ich etwas übersehen?

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

Dies wird Ihre Instanz-Methode mit den gleichen Argumenten aufrufen und dann rufen Sie die message Methode, Rückgabe des Objekts dieser Mailer Aufruf:

Antwort

0

Du hast Recht, normalerweise würde, dass eine Instanz Methode sein, und Sie müssten eine Instanz der Klasse erstellen, vor dem Aufruf consulting_reply() (da es nicht als self.consulting_reply definiert ist). Ihre Klasse erbt jedoch von ActionMailer :: Base, und hinter den Kulissen passiert ein wenig rubinrote Magie. Überprüfen Sie die Quelle für ActionMailer :: Base, um es für sich selbst zu sehen (https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb), aber für Sie zu vereinfachen, was passiert, hier ist ein kurzes Beispiel:

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

Test.fake_class_method 

welche folgende Ausgabe:

durch eine nicht-Klassenmethode namens

Action :: Base tut etwas ähnliches wie diese, die Sie für die Methode aufgerufen dynamisch aussieht. Ich glaube, es auch eine Instanz der Klasse erzeugt werden:

new(method, *args).message 

Wie auch immer, ich hoffe, dass dies etwas Licht wirft, was passiert.

+0

Ist das nicht, was ich gepostet habe, nur länger? Es tut mir leid, ein Sportverderber zu sein :( –

+0

Ich habe es geschrieben, als du deine Antwort geschrieben hast: P – joshaidan

2

ActionMailer::Base hat eine method_missing definiert darauf hoffen, dass mir jemand eine Hilfe geben könnte . Liefern sie, rufen deliver! am Ende des Methodenaufruf:

CoreMail.consulting_reply(email).deliver! 
Verwandte Themen