Rails - 设置/持久化无效日期时如何抛出显式错误

时间:2015-11-26 12:16:21

标签: ruby-on-rails ruby forms date

好的,所以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日。但我想显示错误信息。

我不希望别人意外地将错误的日期输入我的系统。

2 个答案:

答案 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类型中。