2009-06-09 12 views
0

私は非常に迷惑で、私のレールプロジェクトのバグを見つけ出すのは難しいです。Railsモデルの属性が0でないと思われる

モデルとそれらの関係の束を作成した後、それらをリストしたいと思います。

でも、「NilClassをdupできません」というエラーが発生します。つまり、サーバーを再起動するまでです。それから私はそれらをちょうど良い名前を挙げることができます

この問題をデバッグすると、ある属性の値を返すときにモデルのいずれかのメソッドでエラーが発生することがわかります。メソッドにブレークポイントがあり、デバッガでこれを取得します。

 
    (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 

ページをリロードしても問題ありません。私はサーバーを再起動するまで同じエラーが発生します。

私のモデルは基本的に(エラーがメソッドのバズで発生)のようになります

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"]もそうです。これらのどれもnilを返しません。しかし、彼らはfooの代わりにfooのidを返します。

+0

モデルのデータベーススキーマ、fooメソッド定義、およびfooを設定するコードの詳細を提供する必要があります。 –

答えて

0

違いは、別のキーがあることです。 Rubyでは:fooは "foo"と同じではありません(:fooはシンボル、 "foo"はString)。

私が間違っていない場合は、シンボルを文字列に変換する:foo.to_sを入れて試してみることができます。

+0

私はこれについてよく知っています。しかし、実際に問題に対処するわけではありません。 – KaptajnKold

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

最後に解決しました。

私はなぜ正確にはわからないが、私はモデルの定義に「アンロード」追加した場合、問題が消える:私は解決策を見つけたところ

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です。私は完全にそれを理解していませんが、それは動作します:-)

関連する問題