2014-04-14 17 views
8

Tworzę lekką aplikację do tworzenia i wyświetlania informacji o nadchodzących wydarzeniach. Mam zdefiniowaną klasę Event, która jako wartość parametru przyjmuje wartość mieszania args. Metoda inicjalizacji jest zdefiniowana poniżej.Ruby: Class.new wyświetla błąd "Class not initialized" w konsoli szyn

class Event < ActiveRecord::Base 

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

Jak dotąd, tak dobrze. Następnie w konsoli Railsowej definiuję wartość mieszającą args i próbuję utworzyć instancję zdarzenia, ale pojawia się następujący błąd.

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

Wydaje się to bardzo proste, ale mam problem z ustaleniem tego. Każda pomoc jest doceniana.

+0

Czy to ma znaczenie? http://stackoverflow.com/questions/11945070/how-do-i-initialize-an-model-object-in-ror – Amadan

+0

Nie, nie potrzebuję domyślnych wartości początkowych dla klasy. Poniższa odpowiedź AR była tą, której szukałem. – darkmoves

Odpowiedz

12

Jeśli chcesz wykonać blok dla klas dziedziczących ActiveRecord, musisz wywołać super(args) wewnątrz tego bloku, aby podklasa została poprawnie zainicjalizowana.

Jeśli jednak what i theme już istnieje jako kolumny w modelu, nie jest potrzebna metoda initialize: Event.new(args) będzie działać od razu po wyjęciu z pudełka.

Dobrą praktyką byłoby użycie bloku initialize tylko wtedy, gdy trzeba zdefiniować zmienne, które nie występują w schemacie ActiveRecord (np. Ustawienie zmiennych instancji, które nie wymagają trwałości), ale jeśli trzeba to zrobić, to jest to bardziej powszechną praktyką jest używanie attr_accessor.

+1

To ma sens. Wiedziałem, że brakuje mi czegoś prostego. Powiedział, że byłoby dobrze, gdyby komunikat o błędzie był bardziej opisowy. – darkmoves

+2

Połowa tej odpowiedzi jest fałszywa. Rzeczywiście MOŻESZ wykonać 'def initialize' na klasie dziedziczącej AR; jednak w bloku inicjalizacji będziesz musiał wywołać 'super (args)', aby klasa potomna została poprawnie zainicjalizowana. Steve ma rację co do kolumn, jeśli już istnieją, nie ma potrzeby przejmowania się blokiem 'initialize'. –

+1

@JordanBecker dobry punkt, dzięki za edycję. Zatwierdziłem i dodałem wyjaśnienie dotyczące używania 'attr_accessor' jako alternatywy. – SteveTurczyn