2011-04-20 43 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 – 2011-04-21 03:13:54

回答

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>' 

第一行告訴你哪裏出了問題被觸發,爲什麼:在ActiveModel的attribute_methods方法中,因爲在對象中找不到設置器answer。這是通過migrate.rb腳本的第139行呼叫觸發的。堆棧跟蹤技巧是通讀它,尋找你寫的腳本。在我們的代碼中,問題是非常好的,因此從錯誤是我們的假設開始總是好的。

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

是問題所在。你的Question職業沒有answer的二傳手。您可能會丟失或拼寫attribute_accessor電話或拼寫錯誤def answer=方法。

要調試,我建議使用Ruby Debugger 1.9gem install ruby-debug19。這是1.9.2完美,易於使用。您可以在代碼中設置斷點,然後從命令行運行它,該命令行將運行,直到達到斷點並停止在調試器中。從那裏您可以使用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你可以學習如何調試Rails應用程序