(对象不支持#inspect)

时间:2011-10-07 17:23:52

标签: ruby-on-rails-3.1 ruby-1.9.2

我有一个简单的案例,涉及两个模型类:

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实例
Snapshot.new

我得到了

(Object doesn't support #inspect)

现在好的部分。如果我在snapshot.rb中注释掉initialize方法,那么Snapshot.new可以工作。为什么会这样? 顺便说一下,我使用的是Rails 3.1和Ruby 1.9.2

6 个答案:

答案 0 :(得分:9)

这是因为您覆盖基类的initialize方法(ActiveRecord :: Base)。基类中定义的实例变量不会被初始化,#inspect将失败。

要解决此问题,您需要在子类中调用super

class Game < ActiveRecord::Base
  has_many :snapshots

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

答案 1 :(得分:8)

当我在这样的模型中进行序列化时,我有这种症状;

serialize :column1, :column2

需要像;

serialize :column1
serialize :column2

答案 2 :(得分:0)

我不确定原因,但是当我在关联的类定义中意外拼错'belongs_to'为'belongs_to'时,我收到了此错误。

答案 3 :(得分:0)

在实现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

答案 4 :(得分:0)

尝试调用 .valid?在新对象上查看是否可以获得更有用的错误。

在我的例子中,我从一个代码块中得到这个错误,该代码块创建了我的一个模型的一个新实例并为其字段分配值。事实证明,我的代码正在为 Rails 无法与该字段类型匹配的字段之一分配一个值。调用有效吗?在新对象上给了我一个更有用的错误(#

答案 5 :(得分:0)

我在尝试将设计身份验证与现有用户模型集成后遇到了这个问题,我通过运行以下命令解决了这个问题:

$spring stop

不知道确切原因,但希望对某人有所帮助。