2011-10-07 19 views
5

Mam proste sprawy, z udziałem dwóch klas model:(Obiekt nie obsługuje #inspect)

class Game < ActiveRecord::Base 
    has_many :snapshots 

    def initialize(params={}) 
    # ... 
    end 
end 

class Snapshot < ActiveRecord::Base 
    belongs_to :game 

    def initialize(params={}) 
    # ... 
    end 
end 

z tych wędrówek:

class CreateGames < ActiveRecord::Migration 
    def change 
    create_table :games do |t| 
     t.string :name 
     t.string :difficulty 
     t.string :status 

     t.timestamps 
    end 
    end 
end 

class CreateSnapshots < ActiveRecord::Migration 
    def change 
    create_table :snapshots do |t| 
     t.integer :game_id 
     t.integer :branch_mark 
     t.string :previous_state 
     t.integer :new_row 
     t.integer :new_column 
     t.integer :new_value 

     t.timestamps 
    end 
    end 
end 

Gdybym próby utworzenia instancji w Snapshot szyny konsoli, używając

Snapshot.new 

uzyskać

(Object doesn't support #inspect) 

Teraz za dobrą część. Jeśli skomentuję metodę initialize w snapshot.rb, uruchomi się Snapshot.new. Dlaczego to się dzieje?
BTW używam Rails 3.1 i Ruby 1.9.2

+0

Chociaż nie był to Twój problem, pojawia się on, gdy w niestandardowej metodzie 'inspect' pojawia się błąd. Pierwotny błąd nie jest widoczny, co może być denerwujące. –

Odpowiedz

9

Dzieje się tak dlatego, że przesłonić metodę klasy bazowej (ActiveRecord :: Base) initialize. Zmienne instancji zdefiniowane w klasie bazowej nie zostaną zainicjowane, a #inspect zakończy się niepowodzeniem.

Aby rozwiązać ten problem, trzeba zadzwonić super w swojej klasie sub:

class Game < ActiveRecord::Base 
    has_many :snapshots 

    def initialize(params={}) 
    super(params) 
    # ... 
    end 
end 
+0

Dlaczego przekazujesz parametry super? Co zrobi z tym ActiveRecord :: Base? –

0

nie jestem pewien dokładnie dlaczego, ale mam ten błąd, gdy przypadkowo błędnie „belongs_to” jako „belong_to” w powiązana definicja klasy.

7

Miałem ten symptom, gdy miałem serializować w takim modelu;

serialize :column1, :column2 

Potrzebuje być jak;

serialize :column1 
serialize :column2 
+0

i napisałem "serialize: description, Array' inproperly (as" serialize: description,: array') – lakesare

Powiązane problemy