我有一个非常烦人且难以弄清楚我的rails项目中的错误。
在创建了一堆模型及其关系之后,我想列出它们。
但我不断收到错误“无法复制NilClass”。也就是说,直到我重新启动服务器。然后我就可以把它们列好了。
调试此问题时,事实证明当我尝试返回其中一个属性的值时,在其中一个模型中的方法中引发Error。我在方法中有一个断点,这是我在调试器中得到的:
(rdb:5) self #<Bar id: 1037, foo: 2237, created_at: "2009-06-09 19:52:11", updated_at: "2009-06-09 19:52:47"> (rdb:5) foo TypeError Exception: can't dup NilClass (rdb:5) attributes[:foo] nil (rdb:5) attributes["foo"] 2237
如果我重新加载页面,我无所谓。在重新启动服务器之前,我得到了同样的错误。
我的模型基本上看起来像这样(错误发生在方法baz中):
class FooBar < ActiveRecord::Base
belongs_to :foo, :class_name => "BarFoo", :foreign_key => "foo", :dependent => :destroy
belongs_to :bar, :class_name => "BarFoo", :foreign_key => "bar", :dependent => :destroy
validates_presence_of :foo, :on => :create
def baz
[foo, bar].compact
end
end
我的架构如下所示:
create_table "foo_bar", :force => true do |t|
t.integer "foo"
t.integer "bar"
t.datetime "created_at"
t.datetime "updated_at"
end
更新
在我得到更多答案之前指出:foo和“foo”不一样:我知道它们不相同,但这不是问题。
而且,我刚刚确认read_attribute(“foo”)确实返回与read_attribute(:foo)相同的内容。自我[:foo]和自我[“foo”]也是如此。这些都没有返回零。然而,它们都会返回foo的id,而不是foo本身。
答案 0 :(得分:1)
:foo
不等于'foo'
。它等于'foo'.to_sym
或'foo'.intern
。
irb(main):001:0> hash = {:foo => 10, 'foo' => 'bar'}
=> {"foo"=>"bar", :foo=>10}
irb(main):002:0> hash[:foo]
=> 10
irb(main):003:0> hash['foo']
=> "bar"
irb(main):004:0> hash[:foo.to_s]
=> "bar"
irb(main):005:0> hash['foo'.to_sym]
=> 10
irb(main):006:0> hash['foo'.intern]
=> 10
答案 1 :(得分:1)
终于解决了!
虽然我不确定为什么,如果我在模型定义中添加“unloadable”,问题就会消失:
class FooBar < ActiveRecord::Base
unloadable
belongs_to :foo, :class_name => "BarFoo", :foreign_key => "foo", :dependent => :destroy
belongs_to :bar, :class_name => "BarFoo", :foreign_key => "bar", :dependent => :destroy
validates_presence_of :foo, :on => :create
def baz
[foo, bar].compact
end
end
This site是我找到解决方案的地方。我完全不理解它,但它有效: - )
答案 2 :(得分:0)
不同之处在于您拥有不同的密钥。在Ruby中,:foo与“foo”不同(:foo是符号,而“foo”是String)。
如果我没有弄错的话,您可以通过放置:foo.to_s
来尝试将符号转换为字符串。