好的,所以9月有30天了。
当你设置9月31日的无效日期时,这就是rails所做的事情:
s = Student.first
s.date_of_birth = "2015-09-31"
s.save!
> true
s.date_of_birth
> Thu, 01 Oct 2015 00:00:00 UTC +00:00
它将日期设置为10月1日。
我想要的是这样的东西
s.save!
(0.4ms) BEGIN
(0.5ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Date is not a valid date
设置这样的废话日期时,是否有办法强制Rails显式错误输出?当您更改为其他月份时,标准栏date_select
不会动态更改天数下拉列表中的天数。因此,您可以通过下拉菜单选择9月31日,日期将保存为10月1日。但我想显示错误信息。
我不希望别人意外地将错误的日期输入我的系统。
答案 0 :(得分:1)
我认为其中一个解决方案是将date_of_birth的数据类型从datetime
更改为date
。通过这种方式,Rails将验证日期,并且不会允许您已经显示的情况。
将日期存储在date
类型中也是一种很好的做法,因为在处理这些日期时,这会导致潜在问题显着减少。
答案 1 :(得分:0)
尝试将此添加到您的模型中:
def date_of_birth=(d)
date = Date.strptime(d.to_s)
send(:write_attribute, :date_of_birth, date)
end
现在,如果您尝试设置无效日期,则应引发异常:
s.date_of_birth = "2015-09-31" # raises an exception
但是,我不认为这样做是个好主意。这可能是一个更好的主意,因为Andrey Deineko说并将其存储在date
类型中。