2012-03-13 49 views
0

我想驗證我的日期(裏面居然有DATE型)模型。所以,我嘗試寫這個simle方法並通過驗證來運行它。的Rails 3 - 自定義的驗證檢查日期類型

Teacher 

class Teacher < ActiveRecord::Base 
    attr_accessible :teacher_birthday # DATE type! 

    belongs_to :user 

    validates :teacher_birthday, :presence => true, 
           :unless => :date_is_correct? 

    ######## 

    def date_is_correct?  
    parsed_data = Date._parse(:teacher_birthday) 
    input_day = parsed_data[:mday] 
    input_month = parsed_data[:mon] 
    input_year = parsed_data[:year] 

    correct_days = 1..31 
    correct_months = 1..12 
    correct_year = 1900..2000 

    if (correct_days.member? input_day) and (correct_months.member? input_month) and 
     (correct_year.member? input_year) 
     true 
    else 
     errors.add(:teacher_birthday, 'date is invalid') 
     false  
    end  
    end  

當我運行rspec很多測試失敗。

TypeError: can't convert Symbol into String 
# ./app/models/teacher.rb:56:in `_parse' 
# ./app/models/teacher.rb:56:in `date_is_correct?' 

我想我做錯了什麼。有人能告訴我什麼是錯的嗎?

+0

什麼是失敗的消息? – awendt 2012-03-13 16:25:01

+0

你爲什麼想到'Date._parse(:teacher_birthday)'工作? – 2012-03-13 16:54:38

+0

爲什麼不呢?請推薦我更好的方法,請! – ExiRe 2012-03-13 17:07:53

回答

0

這是沒有必要的。如果Date.parse(:teacher_birthday)返回一個日期並且不引發異常,那麼您的日期有效。

0

Date._parse預計包含日期的字符串值,將在你的代碼總是試圖解析「teacher_birthday」。您需要先獲取該字段的值,然後將該值傳遞給Date._parse。 ActiveRecord創建與該字段具有相同名稱的方法來獲取值。 以下任何方式將工作:

短道

parsed_data = Date._parse(teacher_birthday) 

相同地前(self.在分析過程中爲你加)

parsed_data = Date._parse(self.teacher_birthday) 

明確的方式

parsed_data = Date._parse(self[:teacher_birthday]) 
0

創建了一個新的寶石來幫助validate types in railsexplanatory blog post存在回答更多的「爲什麼」這是擺在首位創造。

與此庫您的代碼將簡單爲:當一個除了一個Date任何分配給:teacher_birthday

class Post < ActiveRecord::Base 
    validates_type :teacher_birthday, :date 
end 

這會拋出異常。