2014-04-14 2 views
8

Ich erstelle eine leichte App zum Erstellen und Anzeigen von Informationen für bevorstehende Ereignisse. Ich habe eine Event-Klasse definiert, die einen args-Hash als Parameter akzeptiert. Die Initialisierungsmethode ist unten definiert.Ruby: Class.new gibt "Class not initialized" -Fehler in Rails-Konsole

class Event < ActiveRecord::Base 

    def initialize(args={}) 
    @what  = args[:what] 
    @theme  = args[:theme] 
    ... 
    end 
end 

So weit, so gut. Dann definiere ich in der Rails-Konsole einen args-Hash und versuche, eine Instanz von Event zu erzeugen, bekomme aber den folgenden Fehler.

[4] pry(main)> args = {what: 'what', theme: 'theme'} 
=> {:what=>"what", :theme=>"theme"} 
[5] pry(main)> Event.new(args) 
=> #<Event not initialized> 

Dies scheint wirklich einfach, aber ich habe Probleme, es herauszufinden. Jede Hilfe wird geschätzt.

+0

Ist das relevant? http://stackoverflow.com/questions/11945070/how-do-i-initialize-an-model-object-in-ror – Amadan

+0

Nein, ich brauche keine Standardwerte für die Klasse. Die AR Antwort unten war die, die ich suchte. – darkmoves

Antwort

12

Wenn Sie einen def initialize-Block für ActiveRecord-erbende Klassen erstellen möchten, müssen Sie in diesem Block super(args) aufrufen, damit die Unterklasse ordnungsgemäß initialisiert wird.

Wenn jedoch what und bereits als Spalten in Ihrem Modell vorhanden sind, benötigen Sie die Initialisierungsmethode nicht: Event.new(args) funktioniert gut aus der Box.

Eine gute Übung wäre, nur initialize Block zu verwenden, wenn Sie Variablen definieren müssen, die nicht in Ihrem ActiveRecord-Schema vorhanden sind (z. B. das Setzen von Instanzvariablen, die keine Persistenz erfordern), aber wenn Sie das tun müssen, dann ist es das üblichere Praxis zu verwenden attr_accessor.

+1

Das macht Sinn. Ich wusste, dass ich etwas Einfaches vermisste. Das heißt, es wäre gut, wenn die Fehlermeldung beschreibender wäre. – darkmoves

+2

Die Hälfte dieser Antwort ist falsch. Sie können tatsächlich eine 'def initialize' auf einer AR-vererbenden Klasse tun; Sie müssen jedoch 'super (args)' im Initialisierungsblock aufrufen, damit die untergeordnete Klasse ordnungsgemäß initialisiert wird. Steve hat recht bezüglich der Spalten, wenn sie schon existieren, brauchen sie sich nicht um einen 'initialize' Block zu kümmern. –

+1

@JordanBecker guter Punkt, danke für den Schnitt. Ich habe eine Klärung über die Verwendung von 'attr_accessor 'als Alternative genehmigt und hinzugefügt. – SteveTurczyn

Verwandte Themen