我正在尝试编写一个日期验证器。我遇到的问题是我的验证器将 date_of_birth 视为 Date 对象,但它被设置为字符串。(1) 为什么在应用验证之前将其视为日期而不是字符串,以及 (2) 我应该怎么做才能将其读取为字符串而不是日期。我遇到的问题是我想接受%m/%d/%Y
日期,但是当我输入 2010 年 7 月 5 日时,我将其转换为日期,其中将 05 视为月份,将 07 视为日期。我正在使用 Devise,所以我不确定它是否对控制器中的日期有任何影响,我对此表示怀疑。
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :email, :first_name, :last_name, :password, :password_confirmation, :remember_me, :address, :date_of_birth, as: [:default, :admin]
attr_accessible :active, :role, as: [ :admin ]
validates_presence_of :email, :first_name, :last_name, :address
validate :valid_date_of_birth
def date_of_birth=(date_of_birth)
Rails.logger.info("set date_of_birth: #{date_of_birth}")
Rails.logger.info("set date_of_birth class: #{date_of_birth.class}")
self[:date_of_birth] = date_of_birth
end
private
def valid_date_of_birth
Rails.logger.info "the date of birth: #{date_of_birth}"
Rails.logger.info "the date of birth class: #{date_of_birth.class}"
errors.add(:date_of_birth, 'must be a valid datetime') if ((DateTime.strptime(date_of_birth, "%m/%d/%Y") rescue ArgumentError) == ArgumentError)
end
end
所以,设置 date_of_birth,我得到 String。 valid_date_of_birth
将其视为 Date,即 date_of_birth 的 DB 类型。我在这里做错了什么使这变得过于复杂吗?我唯一的选择是维护一个额外的字符串字段吗?这如何与编辑一起工作?