Rails 3 - 自定义验证以检查日期类型

时间:2012-03-13 16:19:39

标签: ruby-on-rails ruby validation date

我想在模型中验证我的日期(实际上有DATE类型)。所以,我尝试为该simle方法编写并通过验证运行它。

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?'

我想我做错了什么。谁能告诉我有什么问题?

3 个答案:

答案 0 :(得分:0)

这根本不是必需的。如果Date.parse(:teacher_birthday)返回日期并且没有引发异常,则表示您有一个有效的日期。

答案 1 :(得分: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])

答案 2 :(得分:0)

已经创建了一个新的gem以帮助validate types in railsexplanatory blog post来回答更多的&#34;为什么&#34;它是在第一时间创建的。

使用此库,您的代码很简单:

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

如果将Date以外的任何内容分配给:teacher_birthday,则会引发异常。