ruby-on-rails - Rails date_select帮助程序和验证

标签 ruby-on-rails activerecord

我的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/

相关文章:

ruby-on-rails - 从 mongodb 中删除所有 errbit 错误的最快方法是什么?

ruby-on-rails - 如何使用 ActiveRecord 连接设置事务隔离级别?

ruby-on-rails - Rails,has_many :through, 未定义方法 `to_sym` 为 nil:NilClass

ruby-on-rails - 在任何来源中推送到 Heroku 失败 : Could not find net-ssh-2. 10.0。无法通过 Bundler 安装 gems

ruby-on-rails - #to_s 会失败吗?

ruby-on-rails - Rails 非图像文件上传到数据库而不使用服务器端临时文件?

jquery - 在 Rails 中加载表单后调用 JavaScript 函数

MySQL 与 JRuby 的问题

sql - 用什么代替多态关联?

ruby-on-rails - ActiveRecord::Associations::CollectionProxy 从哪里获取.each 实例方法?