【问题标题】:Attribute in Rails model appears to be nil when it's notRails 模型中的属性在不是时似乎为零
【发布时间】:2009-06-12 00:30:20
【问题描述】:

我的 Rails 项目中有一个非常烦人且难以解决的错误。

在创建了一堆模型及其关系之后,我想列出它们。

但我不断收到错误消息“无法复制 NilClass”。也就是说,直到我重新启动服务器。然后我就可以列出它们了。

调试此问题后发现,当我尝试返回其中一个属性的值时,在其中一个模型的方法中引发了错误。我在方法中有一个断点,这就是我在调试器中得到的:

(rdb:5) 自我 # (rdb:5) 富 TypeError 异常:无法复制 NilClass (rdb:5) 属性[:foo] 零 (rdb:5) 属性["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) 相同的结果。 self[:foo] 和 self["foo"] 也是如此。这些都没有返回零。然而,它们都返回 foo 的 id,而不是 foo 本身。

【问题讨论】:

  • 您需要提供更多信息:模型的数据库架构、foo 方法定义和设置 foo 的代码。

标签: ruby-on-rails null


【解决方案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

【讨论】:

    【解决方案2】:

    终于解决了!

    虽然我不确定为什么,但如果我在模型定义中添加“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 是我找到解决方案的地方。我完全不明白,但它有效:-)

    【讨论】:

      【解决方案3】:

      不同之处在于您拥有不同的密钥。在 Ruby 中,:foo 与 "foo" 不同(:foo 是一个符号,而 "foo" 是一个字符串)。

      您可以通过输入:foo.to_s 来尝试一下,如果我没记错的话,它会将符号转换为字符串。

      【讨论】:

      • 我很清楚这一点。然而,它并没有真正解决问题。
      猜你喜欢
      • 1970-01-01
      • 2013-10-19
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      相关资源
      最近更新 更多