2012-03-20 98 views
0

我有模型Teacher其中有字段:teacher_birthday。我从视图中获取:teacher_birthday(单个文本框)。我想确保一个输入日期有这样的格式 - dd.mm.yyyy(我的意思是我想确定输入日期为12.24.1991将不会保存在分贝,因为这样的日期是错误的),并且这个日期存在。另外,我想在MODEL中做到这一点。这可能吗?Rails 3.2 - 验证日期格式

回答

0

声明要在模型中调用的验证方法,然后定义此方法。以下应大致做你需要什么:

validate :validate_teacher_birthday 

private 

def validate_teacher_birthday 
    errors.add("Teacher birthday", "is invalid.") unless (check_valid_date && valid_date_format) 
end 

def valid_date_format 
    self.teacher_birthday.match(/[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]/) 
end 

def check_valid_date 
    begin 
    parts = self.teacher_birthday.split(".") #contains array of the form [day,month,year] 
    Date.civil(parts[2].to_i,parts[1].to_i,parts[0].to_i) 
    rescue ArgumentError 
    #ArgumentError is thrown by the Date.civil method if the date is invalid 
    false 
    end 
end 
+0

我试试你的代码之后,我得到了很多在rspec的错误,例如:'故障/错误:@ user.create_teacher( @attr_teacher) NoMethodError: 未定义的方法拆分为星期三,1980年12月31日:日期。另外,当我访问我的页面,我尝试打印无效的日期后提交我得到'未定义的方法'分裂为零:NilClass' – ExiRe 2012-03-20 13:07:37

+0

此外,当我打印一个正确的日期在我的形式我得到:'未定义的方法分裂为Sun, 1991年12月1日:日期' – ExiRe 2012-03-20 13:14:26

1

尝试chronic宝石。它具有非常灵活的日期解析,包括你在找什么:

[11] pry(main)> require 'chronic' 
=> true 
[12] pry(main)> Chronic.parse('24.12.1991'.gsub('.','-')) 
=> 1991-12-24 12:00:00 -0700 
+0

我该如何验证我的日期?我不明白。我不知道如何获取输入字符串,然后在db中变成日期。 – ExiRe 2012-03-20 14:02:53

+0

@ExR,我建议用Chronic解析你的日期,然后验证它不是零。这不是你要求的,但它为用户提供了更多的灵活性,以便如何输入日期。 – Mori 2012-03-20 14:22:33

+0

对于我所需要的东西没有很好的解决方案,这很糟糕......看起来我会使用控制器并在其中添加错误(无论如何,我讨厌这样的方法)。 – ExiRe 2012-03-20 15:03:46