我有一个简单的案例,涉及两个模型类:
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
答案 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
不知道确切原因,但希望对某人有所帮助。