我想寫一個日期驗證器。我遇到的問題是我的驗證器將date_of_birth視爲Date對象,但它被設置爲String。 (1)爲什麼它在驗證適用之前將它看作日期而不是字符串;(2)我應該怎麼做才能讓它以String而不是Date來讀取它。我遇到的問題是我想接受%m/%d/%Y
日期,但是當我在07/05/2010輸入時,我將它轉換爲日期,其中05看作月份,07看作日期。我正在使用Devise,所以我不確定它是否對控制器中的日期做了些什麼,我懷疑。如何驗證Rails 3中的日期?爲什麼驗證看到日期而不是字符串
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類型。我在這裏做錯了什麼,這使得這過於複雜?我唯一的選擇是維護一個額外的字符串字段嗎?這項工作如何編輯?
順便說一句,維護額外的字符串字段很好。只是想知道我是否錯過了一些東西。 – Bradford 2012-07-10 18:26:33