Rails模型中的属性似乎是零而不是

时间:2009-06-09 20:07:38

标签: ruby-on-rails null

我有一个非常烦人且难以弄清楚我的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本身。

3 个答案:

答案 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来尝试将符号转换为字符串。