1

わかりました、日付のある関数に対して何らかの形でこのエラーが発生します:

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
4

1 に答える 1

2

Date無効なパラメーターでオブジェクトをインスタンス化しようとしています。

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

あなたの問題は、おそらく上記のコードではなく、挿入しているデータです。無効な日付を持つレコードがないかデータベースを確認してください。

日付が無効な場合、送信時にユーザーにエラーを表示することで、このようなエラーを防ぐことができます。それを達成するために、モデルに検証ルールを追加できます。

class Patient < ActiveRecord::Base
  validate :birthday, if:->(d){ Date.valid_date?(d) }
end
于 2013-09-19T19:08:15.313 に答える