Ruby: Klasse.neue gibt "Klasse nicht initialisiert" Fehler in der rails-Konsole
Ich bin momentan dabei, eine kleine app zu erstellen und Anzeige von Informationen für kommende Veranstaltungen. Ich habe eine Event-Klasse definiert werden, die ein args-hash als parameter. Die initialize-Methode ist unten definiert.
class Event < ActiveRecord::Base
def initialize(args={})
@what = args[:what]
@theme = args[:theme]
...
end
end
So weit, So gut. Dann, in der Rails-Konsole, definiere ich ein args-hash und versuchen, erstellen Sie eine Instanz von Event, aber bekomme die folgende Fehlermeldung.
[4] pry(main)> args = {what: 'what', theme: 'theme'}
=> {:what=>"what", :theme=>"theme"}
[5] pry(main)> Event.new(args)
=> #<Event not initialized>
Dies scheint sehr einfach, aber ich habe Mühe, es herauszufinden. Jede Hilfe ist willkommen.
- Ist das relevant? stackoverflow.com/questions/11945070/...
- Nein, ich brauche keine Standard-initial-Werte für die Klasse. Die AR-Antwort unten war die, die ich suchte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, eine
def initialize
block für die ActiveRecord-Klassen Erben, müssen Sie rufensuper(args)
innerhalb dieses Blocks, um für die Unterklasse korrekt initialisiert.Jedoch, wenn
what
undtheme
existiert bereits als Spalten in Ihrem Modell, müssen Sie nicht die initialize-Methode:Event.new(args)
wird funktionieren out of the box.Einer guten Praxis wäre nur
initialize
block, wenn Sie brauchen, um zu definieren Variablen, die nicht in Ihrem ActiveRecord-schema (z.B. instance-Variablen, die brauchen keine Ausdauer), aber wenn Sie benötigen, zu tun, dann es ist die mehr üblichattr_accessor
.def initialize
auf eine AR-Klasse Erben; jedoch müssen Sie rufensuper(args)
im initialize-block, damit das Kind die Klasse richtig initialisiert. Steve ist rechts über die Spalten, wenn Sie bereits existieren keine Notwendigkeit, die Mühe mit eineminitialize
block.attr_accessor
als alternative.attr_accessor
wie gut!super
keineargs
notwendig, richtig? Alle Argumente werden übergebensuper
automatisch, nicht?super()
geht mit keine Argumente.