2011-04-20 2 views
0

데이터베이스에서 데이터를 이전 중이며 오류가 발생하여 이해할 수 없습니다. 나는 Ruby에 익숙하지 않고 내 코드에 무엇이 잘못된지와 디버깅을위한 가장 효과적인 명령을 찾고있다. 나는 내 실수를 정말로 읽을 수조차 없다. 이 오류를 읽기 및 디버깅하는 방법에 대한Ruby를 처음 접한다면

/Users/skline/.rvm/gems/[email protected]/gems/activemodel-3.0.6/lib/active_model/attribute_methods.rb:367:in `method_missing': undefined method `answer=' for #<Question:0x00000102d59758> (NoMethodError) 
    from /Users/skline/.rvm/gems/[email protected]/gems/activerecord-3.0.6/lib/active_record/attribute_methods.rb:46:in `method_missing' 
    from ./script/migrate.rb:139:in `block (2 levels) in <main>' 
    from /Users/skline/.rvm/gems/[email protected]/gems/activerecord-3.0.6/lib/active_record/relation.rb:13:in `each' 
    from /Users/skline/.rvm/gems/[email protected]/gems/activerecord-3.0.6/lib/active_record/relation.rb:13:in `each' 
    from ./script/migrate.rb:137:in `block in <main>' 
    from ./script/migrate.rb:111:in `each' 
    from ./script/migrate.rb:111:in `<main>' 

모든 팁 :

여기 내 오류입니다.

NetworkCommunications.all.each do |nc| 
    if nc.NETWORK_COMM_TYPE_ID==1 && nc.SENDER_CONSUMER_ID != 0 
    q = Question.new 
    q.created_at = nc.LAST_MOD_TIME 
    category = CommunicationInterestMapping.where(:COMMUNICATION_ID => nc.COMMUNICATIONS_ID).first 
    if category 
     cie = ConsumerInterestExpertLookup.find(category.CONSUMER_INTEREST_EXPERT_ID) 
     if cie 
     q.category = Category.find_by_name cie.CONSUMER_INTEREST_EXPERT_NAME 
     else 
     puts "No category" 
     end 
    end 

    message = NetworkCommunicationsMessage.where(:COMMUNICATIONS_ID => nc.COMMUNICATIONS_ID).first 
    q.title = message.SUBJECT 
    q.description = message.MESSAGE 
    q.permalink = message.QUESTION_SLUG 

    email = find_email_from_consumer_id(nc.SENDER_CONSUMER_ID) 
    q.user = User.find_by_email email 

    children = NetworkCommunications.where(:PARENT_COMMUNICATIONS_ID => nc.COMMUNICATIONS_ID) 
    puts children 

    if children 
     children.each do |ncc| 
     if ncc.NETWORK_COMM_TYPE_ID == 2 
      q.answer = Answer.new 
      q.answer.created_at = ncc.LAST_MOD_TIME 
      message_a = NetworkCommunicationsMessage.where(:COMMUNICATIONS_ID => ncc.COMMUNICATIONS_ID).first 
      q.answer.text = message_a.MESSAGE 
      email_a = find_email_from_consumer_id(ncc.SENDER_CONSUMER_ID) 
      q.answer.user = User.find_by_email email_a 
     end 
     end 
    end 

    begin 
     q.save! 
    rescue Exception => e 
     puts "Exception: #{e} title: #{message.SUBJECT}" 
    end 
    end 
end 
+0

자세히 관련 질문 : http://stackoverflow.com/questions/3955688/how-do-i-debug-ruby-scripts –

답변

2

레일 : 문제가 촉발 된 곳

/Users/skline/.rvm/gems/[email protected]/gems/activemodel-3.0.6/lib/active_model/attribute_methods.rb:367:in `method_missing': undefined method `answer=' for #<Question:0x00000102d59758> (NoMethodError) 
    from /Users/skline/.rvm/gems/[email protected]/gems/activerecord-3.0.6/lib/active_record/attribute_methods.rb:46:in `method_missing' 
    from ./script/migrate.rb:139:in `block (2 levels) in <main>' 

첫 번째 라인을 설명하는 이유 : answer에 대한 설정자가 개체에서 발견되지 않았으므로 ActiveModel의 메서드에 있습니다. 이것은 migrate.rb 스크립트의 139 행에있는 호출에서 발생합니다. 스택 트레이스의 트릭은 스크립트를 통해 읽은 스크립트를 찾는 것입니다. 확률은 정말 좋습니다. 문제는 우리 코드에 있습니다. 버그가 우리의 것이라는 가정에서 시작하는 것이 좋습니다.

if ncc.NETWORK_COMM_TYPE_ID == 2 
    q.answer = Answer.new 

입니다. Question 클래스에는 answer에 대한 설정자가 없습니다. attribute_accessor 전화가 누락되었거나 맞춤법이 잘못되었거나 def answer= 메소드의 철자가 잘못되었습니다.

디버깅하려면 Ruby Debugger 1.9을 사용하는 것이 좋습니다. gem install ruby-debug19. 그것은 1.9.2의 studly하고 사용하기 쉽습니다. 코드에 중단 점을 설정 한 다음 명령 줄에서 실행하면 중단 점에 도달 할 때까지 실행되고 디버거에서 중지됩니다. 거기에서 l을 사용하여 현재 줄을 나열하고, 예쁜 프린터가 설치된 경우 p을 사용하여 변수 내용을 표시하거나 require 'pp'을 수행 할 수 있습니다. s을 사용하는 방법으로 단일 단계를 수행하거나 n을 사용하여 단계를 건너 뛸 수 있습니다 ('다음'). 계속하려면 c이 있고, 특정 줄 번호로 계속하려면 c 100입니다. 100입니다. b 100을 사용하여 100 줄에 중단 점을 설정하고 c을 실행할 때마다 매번 100을 중지 할 수 있습니다. irb는 IRB에 당신을 드롭 할 것이고, 그 점에 대한 변수는 이미 초기화되어있어서 그것들을 찌를 수 있습니다. 다른 명령이 많이 있지만 그 중 자주 사용하는 명령입니다.

0

그것은 아마 당신이 당신의 질문 클래스의 응답 속성을 정의 의미 :

참고 여기 내 코드입니다

class Question < ActiveRecord::Base 
    attr_accessor :answer 
    [...] 
end 

또한 rdebug를 사용하는 방법을 배워야한다 당신이 할 수 있도록 코드를 단계별로 실행하고 도움없이 해결하십시오.

0

귀하의 모델 질문에 answer 속성이 없다고 생각합니다. 디버깅하는 방법을 연구 할 수이 cast에서 는, 스택 덤프를 읽은 다음 아래로 읽는 첫 번째 줄에서 찾으려면 응용 프로그램을