Rails: ошибка "NoMethodError: неопределенный метод` <'для nil: NilClass ", отсутствует какой-либо драгоценный камень? - PullRequest
0 голосов
/ 22 марта 2011

Вот модель класса Класс Item :: Item

         def validate_start_and_end_date
             errors.add(:start_date, "should not be in past") if start_date < Date.today
             errors.add(:end_date, "should not be in past") if end_date < Date.today
             errors.add(:base, "start date should not be after end date") if end_date <  start_date
         end

         belongs_to :product, {:class_name => 'Item::Product'}

   end 

Вот журнал рельсов консоли

    ruby-1.8.7-p334 :020 > item = Item::Item.new 
    => #<Item::Item id: nil, start_date: nil, end_date: nil, product_id: nil> 
    ruby-1.8.7-p334 :021 > item.valid?
    NoMethodError: undefined method `<' for nil:NilClass
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in `method_missing'
    from /media/Development/codie/orgstud-security/app/models/lecture/lecture.rb:13:in `validate_start_and_end_date'
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:419:in `_run_validate_callbacks'
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activemodel-3.0.3/lib/active_model/validations.rb:212:in `run_validations!'
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activemodel-3.0.3/lib/active_model/validations/callbacks.rb:67:in `run_validations!'
    from /home/sgarg/.rvm/gems/ruby-1.8.7-p334/gems/activesupport-3.0.3/lib/active_support/callbacks.rb:413:in `_run_validation_callbacks'
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activemodel-3.0.3/lib/active_model/validations/callbacks.rb:67:in `run_validations!'
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activemodel-3.0.3/lib/active_model/validations.rb:179:in `valid?'
    from /home/maddy/.rvm/gems/ruby-1.8.7-p334/gems/activerecord-3.0.3/lib/active_record/validations.rb:55:in `valid?'
from (irb):21

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Жалуется, потому что атрибуты start_date и end_date не были установлены, когда он достигает вашей пользовательской проверки. Когда он пытается сравнить start_date с сегодняшней датой, он пытается сравнить нулевое значение.

Вы можете заключить проверку в условный блок:

if !start_date.nil? && !end_date.nil?
  ...
end
1 голос
/ 22 марта 2011

Обратите внимание, что Item объект, который вы создаете в консоли, имеет start_date, end_date и т. Д. nil.

Сравнение nil < Date.today в вашем методе проверкивызывает исключение.

...