読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

ActiveRecord の Date型の検証

Rails

Date型の検証がうまくいってない。。

class Account < ActiveRecord::Base
  ...
  validates :date, :presence => true, :format => {:with => /\A\d{4}-\d{2}-\d{2}\z/}
  ...

な感じで日付のフォーマットを指定してるんだが、

2.2.0 :004 >   a = Account.new(:account_type => 'income', :date => '01-01-1000', :content => 'test', :category => 'test', :price => 100)
 => #<Account id: nil, account_type: "income", date: "1000-01-01", content: "test", category: "test", price: 100, created_at: nil, updated_at: nil> 
2.2.0 :005 > a.validate
 => true 
2.2.0 :006 > a.errors
 => #<ActiveModel::Errors:0x00000005afda70 @base=#<Account id: nil, account_type: "income", date: "1000-01-01", content: "test", category: "test", price: 100, created_at: nil, updated_at: nil>, @messages={}> 
2.2.0 :007 >

多分だけど、Account.newした時点でDate.parseされてる気がするんだよね〜

db/schema

create_table "accounts", force: :cascade do |t|
  t.string   "account_type", limit: 255
  t.date     "date"
  t.string   "content",      limit: 255
  t.string   "category",     limit: 255
  t.integer  "price",        limit: 4
  t.datetime "created_at",               null: false
  t.datetime "updated_at",               null: false
end

と書いてあるから自動的に変換されるのかな。。。と推測

まぁフォーマットなんて気にしない!っていう人はいいけど、new する前に検証するにはどうしたらいいんだろ

別の検証用クラスとか作るのかな〜(・ω・)


ちなみに、t.integerの属性も new した時にto.iされるっぽいね