2012-03-30 4 views
0

Ich bin herumalbern mit der Erstellung eines Rails Juwel und ich habe Probleme beim Hinzufügen von Methoden zu ActiveRecord. Sagen wir, ich folgendes tun:Rails: Appending Methoden zu ActiveRecord (der richtige Weg?)

class DemoModel < ActiveRecord::Base 
    custom_method :first_argument, :second_argument 
end 

Um diese Arbeit zu machen, ich werfe in den folgenden:

module DemoMethod 

    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods  
    def custom_method(*fields) 
     @my_fields = fields 
    end 
    end 

end 

ActiveRecord::Base.send(:include, DemoMethod) 

So weit, so gut.

Das Problem ist, ich möchte dann auf diese my_fields-Variable von der Instanz des Modells zugreifen. Zum Beispiel habe ich eröffnen könnte form_for mit so etwas wie:

module ActionView::Helpers::FormHelper 
    def fields_for(record_name, record_object, options = {}, &block) 
    the_fields = record_object.<I WANNA ACCESS @my_fields HERE!!!>.html_safe 
    # ... 
    end 
end 

Die Schwierigkeit besteht darin, ‚custom_method‘ scheint nur zu arbeiten, wenn ich die Helfer als Klassenmethode festgelegt, aber das bedeutet .self ist jetzt das Modell (DemoModel) anstelle des DemoModel-Objekts, an dem ich arbeiten möchte. Ich könnte das Objekt manuell mit "custom_method self,: first_argument,: second_argument" übergeben, aber es scheint ein bisschen ungeschickt zu sein, die Benutzer meiner wundervollen "custom_method" -Medaille zu bitten, sich selbst auf ihre Liste von Argumenten voranzustellen.

Also, die Frage ist, wie würde eine weisere Rails Person Werte für ein bestimmtes Objekt durch custom_method setzen, und sie dann woanders abrufen, wie fields_for?

Wie immer, irgendwelche Vorschläge geschätzt.

Antwort

2

Mit den self.included und ClassMethods werden die Methoden als Klassenmethoden hinzugefügt.

Durch das Definieren von Methoden, die normalerweise im Modul enthalten sind, und deren Einschließen sind die Methoden zum Erstellen gewöhnlicher Instanzmethoden verfügbar. So ähnlich:

module DemoMethod 

    def custom_method(*fields) 
    @my_fields = fields 
    end 
end 

ActiveRecord::Base.send(:include, DemoMethod) 
+0

Ach - natürlich. Der .Extend verwirrte mich. Danke vielmals. – PlankTon

Verwandte Themen