(Объект не поддерживает #inspect) - PullRequest
6 голосов
/ 07 октября 2011

У меня есть простой случай, включающий два модельных класса:

class Game < ActiveRecord::Base
  has_many :snapshots

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

class Snapshot < ActiveRecord::Base
  belongs_to :game

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

с этими миграциями:

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

Если я пытаюсь создать экземпляр снимка в консоли rails, используя

Snapshot.new

Я получаю

(Object doesn't support #inspect)

Теперь по хорошей части. Если я закомментирую метод инициализации в snapshot.rb, то Snapshot.new работает. Почему это происходит?
Кстати, я использую Rails 3.1 и Ruby 1.9.2

Ответы [ 4 ]

9 голосов
/ 10 ноября 2011

Это происходит потому, что вы переопределяете метод initialize вашего базового класса (ActiveRecord :: Base).Переменные экземпляра, определенные в вашем базовом классе, не будут инициализированы, и #inspect завершится ошибкой.

Чтобы решить эту проблему, вам нужно вызвать super в вашем подклассе:

class Game < ActiveRecord::Base
  has_many :snapshots

  def initialize(params={})
   super(params)
   # ...
  end
end
8 голосов
/ 03 июля 2013

У меня был этот симптом, когда у меня была сериализация в модели, подобной этой;

serialize :column1, :column2

Должен быть похожим;

serialize :column1
serialize :column2
0 голосов
/ 04 июня 2019

Это также может произойти при реализации after_initialize, особенно если вы пытаетесь получить доступ к атрибутам, которые не были включены в ваш select.Например:

after_initialize do |pet|
  pet.speak_method ||= bark  # default
end

Чтобы исправить, добавьте тест на наличие атрибута:

after_initialize do |pet|
  pet.speak_method ||= bark if pet.attributes.include? 'speak_method'  # default`
end
0 голосов
/ 22 сентября 2012

Я точно не знаю, почему, но я получил эту ошибку, когда случайно ошибся в названии принадлежащего класса «own_to» как «own_to».

...