Rails 3 - пользовательская проверка для проверки типа даты - PullRequest
0 голосов
/ 13 марта 2012

Я хочу проверить свою дату (которая на самом деле имеет тип 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 голосов
/ 13 марта 2012

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 голосов
/ 04 сентября 2015

Был создан новый драгоценный камень, чтобы помочь проверить типы в рельсах , и существует пояснительная запись в блоге , чтобы ответить на большее количество "почему", он был создан в первую очередь.

С этой библиотекой ваш код будет простым:

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

Это вызовет исключение, когда что-либо, кроме Date, назначено :teacher_birthday.

0 голосов
/ 13 марта 2012

Это совсем не обязательно.Если Date.parse (: teacher_birthday) возвращает дату и не вызывает исключение, у вас есть действительная дата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...