Новичок в Ruby пытается научиться отлаживать - PullRequest
0 голосов
/ 21 апреля 2011

Я мигрирую данные из базы данных и получаю ошибку, которую не могу понять.Я новичок в Ruby и ищу, что не так с моим кодом, а также наиболее эффективные команды для отладки.Я даже не могу прочитать мою ошибку.

Вот моя ошибка:

/Users/skline/.rvm/gems/ruby-1.9.2-p136@rails3tutorial/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/ruby-1.9.2-p136@rails3tutorial/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/ruby-1.9.2-p136@rails3tutorial/gems/activerecord-3.0.6/lib/active_record/relation.rb:13:in `each'
    from /Users/skline/.rvm/gems/ruby-1.9.2-p136@rails3tutorial/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

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Чтобы прочитать дамп стека, посмотрите на первую строку, затем прочитайте вниз:

/Users/skline/.rvm/gems/ruby-1.9.2-p136@rails3tutorial/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/ruby-1.9.2-p136@rails3tutorial/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 был найден в объекте.Это было вызвано вызовом в строке 139 вашего migrate.rb сценария.Хитрость с трассировкой стека заключается в том, чтобы прочитать ее и найти написанные вами сценарии.Шансы действительно хорошие, проблема в нашем коде, поэтому всегда хорошо начинать с предположения, что наша ошибка.

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 прост и удобен в использовании.Вы можете установить точку останова в своем коде, а затем запустить ее из командной строки, которая будет работать, пока точка останова не будет достигнута, и остановится в отладчике.Оттуда вы можете просмотреть текущие строки с помощью l, отобразить содержимое переменных с помощью p или сделать require 'pp', если у вас установлен pretty-printer.Вы можете перейти к методам, используя s, или перейти к ним, используя n, для «следующего».Также есть c для продолжения, c 100 для продолжения до определенного номера строки;100 в этом примере.Вы можете использовать b 100 для установки точки останова на строке 100, а затем c для запуска, останавливаясь на 100 каждый раз.irb переведет вас в IRB с уже инициализированными переменными к этому моменту, чтобы вы могли их ткнуть.Есть много других команд, но это те, которые я использую чаще всего.

0 голосов
/ 21 апреля 2011

Я думаю, что ваша модель Вопрос не имеет атрибута answer. В этом cast вы можете научиться отлаживать приложение rails

0 голосов
/ 21 апреля 2011

Это, вероятно, означает, что вы определили атрибут ответа для вашего класса вопросов:

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

Вы также должны узнать, как использовать rdebug, чтобы вы могли пройти по коду и выяснить это без посторонней помощи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...