2012-07-10 76 views
0

我想寫一個日期驗證器。我遇到的問題是我的驗證器將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類型。我在這裏做錯了什麼,這使得這過於複雜?我唯一的選擇是維護一個額外的字符串字段嗎?這項工作如何編輯?

+0

順便說一句,維護額外的字符串字段很好。只是想知道我是否錯過了一些東西。 – Bradford 2012-07-10 18:26:33

回答

1

如果您DATE_OF_BIRTH屬性正從參數設置/從形式 - 那麼它的未來作爲一個字符串。這個問題一旦被設置爲一個對象時就會出現 - 它將被轉換爲數據庫中的數據類型。

所以在users_controller創建行動: PARAMS [:用戶] [:DATE_OF_BIRTH]即將作爲一個字符串

但只要你將它設置爲用戶對象: @ user.date_of_birth = params [:user] [:date_of_birth] ##它被轉換爲數據庫中的類型(Date類型)。

解決方案: 1)在分配之前驗證控制器中的date_of_birth。 2)在分配給用戶對象之前,爲模型中的date_of_birth_input定義一個attr_accessor,並像在當前那樣進行驗證。