我的Rails应用程序中有一个模型支持的表单中的日期字段:
<%= f.date_select :birthday,
{:start_year => Time.now.year,
:end_year => 1900,
:use_short_month => true,
:order => [:month, :day, :year],
:prompt => {:month => 'Month', :day => 'Day', :year => 'Year'}},
{:class => 'year',
:id => 'user_birthday'}
%>
使用以下代码在模型代码中对其进行验证:
validates_presence_of :birthday, :message => 'is a required field'
不幸的是,如果用户输入部分值(例如年份),则表单仍会提交而不会出现错误。而是将一个时髦的日期值写入数据库。如何使所有三个字段都为必填项?
我想为此编写一个自定义验证,但是我不知道如何正确访问生日元素的各个部分。我怎样才能做到这一点?
谢谢!
萌
最佳答案
我认为您必须在 Controller 本身中创建验证。
日期部分将传递给birthday(1i)
,birthday(2i)
和birthday(3i)
。这里的问题是,在传递属性时(因此在进行任何验证之前)会立即分配它们。
您也可以覆盖attributes=
方法以在此处创建自己的验证,但是我不建议您这样做。
请记住,如果您进行验证,则最好也针对任何不正确的日期进行验证。 (例如2月31日,如果通过则将产生3月2日,而不是错误)。
我认为这里的主要问题是ActiveRecord实际上在创建1
之前将空值替换为Date
,这也意味着如果访问者仅通过年份,则日期将在该年的1月1日创建。我猜想这是一种预期的行为,只允许使用年/月/日选择中的一项,并且仍会创建一个有用的日期。
关于ruby-on-rails - Rails date_select帮助程序和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3295376/