2009-06-09 6 views
0

저는 제 레일 프로젝트에서 버그를 알아 내는데 매우 짜증나고 힘듭니다.레일스 모델의 속성이 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"]도 마찬가지입니다. 이들 중 아무 것도 반환하지 않습니다. 그러나 그들은 모두 foo 대신에 foo의 id를 반환합니다.

+0

모델에 대한 데이터베이스 스키마, foo 메소드 정의 및 foo를 설정하는 코드에 대한 자세한 정보를 제공해야한다. –

답변

0

다른 점은 다른 키를 사용한다는 것입니다. 루비에서 : foo는 "foo"와 같은 것이 아닙니다 (: foo는 기호이고 "foo"는 문자열 임).

내가 실수하지 않는다면 심볼을 문자열로 변형시킬 수있는 :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입니다. 나는 완전히 이해하지 못한다. 그러나 작동한다 :-)

관련 문제