2012-04-09 8 views
0

I die folgende Dateihierarchie haben:Rails: Initialize-Methode in-Modul aus Bibliothek geladen Zusammenstoß

Lib> MyModule.rb Lib> MyModule.rb> MyClass.rb

In MyModule.rb, ich habe eine Methode initialize:

def initialize(variable, parameter) 
    @variable = variable 
    @parameter = parameter 
end 

Allerdings, wenn ich eine Instanz meiner Klasse versuchen und schaffen, ist das Ergebnis ein Fehler:

undefined method: set is not defined for nil 

Ich versuchte es mit dieser rekonstruierten Version von initialize zu beheben:

def initialize(variable, parameter) 
    @variable = variable 
    @parameter = parameter 
end 

der Fehler dadurch lindert, die ich erhalten. Aber jetzt gehe ich eine Instanz meiner Klasse in einer HTML.erb-Datei zu erstellen:

<%= MyModule::MyClass.new("string", 1) %> 

Hier habe ich ein Argument Fehler: 2 für 0

Kann das jemand erklären?

Weitere Informationen angefordert:

Ich versuche, ein paar Methoden zu erstellen, die für häufig verwendete Elemente HTML-Tags als Convenience-Wrapper erstellen. Diese verwenden insbesondere die Helpermethode content_tag von rails, um neue Methoden zu erstellen. Der Plan sieht schließlich vor, die Unterstützung für verschachtelte Tags hinzuzufügen, indem der einfache Operator < < verwendet wird.

Lib/tags.rb

module Tags 
    include ActionView::Helpers::TagHelper 
    include ActionView::Helpers::JavaScriptHelper 
    include ActionView::Context 

    def initialize(type, content, options, &block) 
    @type = type 
    @content = content 
    @options = block_given? ? nil : options 
    @block = block_given? ? block : nil 
    end 

    def show 
    if @block.nil? 
     content_tag(@type, @content, @options) 
    else 
     content_tag(@type, @content, @options) { @block.call } 
    end 
    end 
end 

Nun ist dies das niedrigste Niveau des Moduls; Diese werden allen Tags gemeinsam sein, die ich implementieren werde. Ich habe dann eine Klasse in den Tags-Ordnern (Lib/tags/div.rb):

module Tags 
    class DivTag 
    def initialize(content, options, &block) 
     super(:div, content, options, &block) 
    end 
    end 
end 

Dann in meiner Testdatei main.rb (das, was ist, geleitet, wenn auf localhost gehen)

Und hier bekomme ich meinen Fehler.

+0

Dies ist ein wenig unklar. Können Sie beschreiben, was die definierten Klassen/Module sind, wie sie miteinander verwandt sind und welche Methoden wo definiert sind? – tsherif

+0

Ich habe weitere Informationen hinzugefügt –

Antwort

0

"def-Tags" - das ist falsche Ansatz, Sie Klasse-Tags verwenden, sollte ...

"super" in Methode aufrufen - Klasse sollte von anderen Klasse geerbt werden, zum Beispiel Klasse DivTag < Schlagwörter :: Base def initialisieren super() # < - Tags :: Base # initialisieren Ende Ende

von Standardklasse jede neue Klasse erbt von "Objekt" und Objekt # initialisieren 0 Argumente akzeptieren.

Warum verwenden Sie nicht "content_tag" Helfer (http://apidock.com/rails/ActionView/Helpers/TagHelper/content_tag)? Es ist fast das, was Sie wollen

+0

Das sollten Modul-Tags sein, mein Fehler, nicht "Def-Tags". mein Fehler bei der Übertragung hier, aber nicht im Code. Erbt Super nicht von einem Modul? –

+0

Außerdem verwende ich das content_tag innerhalb dieser Module. Der Sinn dieser Architektur besteht darin, verschachtelte Tags so zu gestalten, dass sie für mich mehr Sinn ergeben: indem ich jedes Tag als Objekt behandle. Andernfalls müssen Sie content_tags ungeschickt verschachteln. Außerdem werden einige dieser Tags stark angepasst, so dass ich nicht alle diese Parameter für jede benutzerdefinierte Tags verfolgen muss. Ich möchte, dass die Klassendefinition dabei hilft. –

+0

Nein. Wenn Klasse in Modul-Namespace, wie Tags :: Div geben Sie nichts zur Klasse, nur einen Namen. Sie können 'ActiveSupport :: Concern 'verwenden, um die Klasse um das Modul zu erweitern, aber Sie müssen ' class Tags schreiben :: Div; umfassen Tags; # ... Ende' –

Verwandte Themen