2012-03-13 53 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 

这会抛出异常。