2013-09-19 4 views
1

Ok я как-то получить эту ошибку для функции с датой:`новый ': неверная дата (ArgumentError)

C:/geburtstag/app/config/initializers/update_year.rb:11:in `new': invalid date (
ArgumentError) 
    from C:/geburtstag/app/config/initializers/update_year.rb:11:in `block i 
    n <top (required)>' 

код выглядит следующим образом:

Patient.all.each do |f| 
    if (f.birthday.get_birthday + 1) != f.year 
    f.update_attribute :year, f.birthday.get_birthday + 1 
    end 

    if f.thisyear.blank? 
    f.update_attribute :thisyear, Date.new(Date.today.year, f.birthday.month, f.birthday.mday) 
    end 
    if f.thisyear.year != Date.today.year 
f.update_attribute :thisyear, Date.new(Date.today.year, f.birthday.month,f.birthday.mday) 
    end 
end 

Линия 11:

f.update_attribute :thisyear, Date.new(Date.today.year, f.birthday.month, f.birthday.mday) 

Я не понимаю, почему я получаю эту ошибку! Я сделал несколько тестов на консоли, все работало нормально! Я надеюсь, что вы можете помочь мне! Благодаря

irb(main):005:0> c = Patient.find(24367) 
←[1m←[36mPatient Load (0.0ms)←[0m ←[1mSELECT "patients".* FROM "patients" WHE 
RE "patients"."id" = ? LIMIT 1←[0m [["id", 24367]] 
=> #<Patient id: 24367, vorname: "Hanz", nachname: "Schnitzel", birthday: "1961-06 
-29", geschlecht: "1", drucken: nil, extraanrede: nil, extratext: nil, year: nil 
, rund: nil, thisyear: nil, zuletzt: nil, strasse: "Lsu 15", ort: "W÷rth", pl 
z: "93386", created_at: "2013-09-19 16:37:28", updated_at: "2013-09-19 16:37:28" 
> 
irb(main):006:0> b = Patient.birthday 
irb(main):007:0> d = c.birthday 
=> Thu, 29 Jun 1961 
irb(main):009:0> month = d.month 
=> 6 
irb(main):010:0> day = d.mday 
=> 29 
irb(main):011:0> year = Date.today.year 
=> 2013 
irb(main):012:0> neu = Date.new(year,month,day) 
=> Sat, 29 Jun 2013 
+1

Вы уверены, что все поля '' дня рождения являются допустимыми датами? Напр. у кого-то есть «день рождения» в «1981-13-32». Другая возможность - проблема високосного года. День рождения Семьи - 29 февраля года, который недействителен для текущего года. – tihom

+0

как я могу проверить это, и если это так, пропустите этого пациента? –

+0

Эй ** Вы публикуете конфиденциальные и конфиденциальные данные о пациенте ** (медицинские данные), давая его имя и фамилию. Пожалуйста, избегайте этого, это незаконно – MrYoshiji

ответ

2

Вы пытаетесь создать экземпляр Date объекта с неправильными параметрами, например,

Date.new(2013,99,1) 
# => ArgumentError: invalid date 

Проблема, скорее всего, не приведенный выше код, а данные, которые вы вставляете. Проверьте свою базу данных для записей с неверными датами.

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

class Patient < ActiveRecord::Base 
    validate :birthday, if:->(d){ Date.valid_date?(d) } 
end 
+0

Как я могу написать что-то вроде этого: 'Date.new (Date.today.year, f.birthday.month, f.birthday.mday) .valid_date?' –

+1

'valid_date?' - метод класса, просто выполните 'Date .valid_date? (Date.today.year, f.birthday.month, f.birthday.mday) ' –

Смежные вопросы