Чтобы прочитать дамп стека, посмотрите на первую строку, затем прочитайте вниз:
/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 с уже инициализированными переменными к этому моменту, чтобы вы могли их ткнуть.Есть много других команд, но это те, которые я использую чаще всего.