Não existe no core do Ruby on Rails um validator para datas, mas existe um plugin que faz muito bem essa tarefa, o nome do plugin é validates_date_time.
Esse plugin está disponível no Github em: http://github.com/nickstenning/validates_date_time/.
Instalação
./script/plugin install git://github.com/nickstenning/validates_date_time.git
Configuração
class Investor < ActiveRecord::Base
validates_date :date_of_birth
end
Esse validator aceita datas no formato: 2006-01-01 ou 1 Jan 06 ou 1 Jan 2006 ou 10/1/06 ou 1/1/2006, por padrão o plugin espera datas no formato dia/mês/ano, caso você queria datas no formato americano e necessário adicionar a seguinte linha no seu config/environment.rb:
ValidatesDateTime.us_date_format = true
Outro detalhe é que o validates_date por padrão considera que o campo de data é obrigatório, caso você queria que seu preenchimento seja opcional você pode adicionar o parâmetro :allow_nil => true da seguinte forma:
validates_date :date_of_birth, :allow_nil => true
I18n
Eu procurei na internet uma forma elegante para usar I18n no plugin, eu encontrei apenas uma (http://github.com/nickstenning/validates_date_time/blob/master/test/fixtures/en.yml), mas essa solução não contempla todas as mensagens de validações, existe a mensagem de validação de data inválida que eu não consegui traduzir da forma do link anterior, desta forma eu implementei manualmente o I18n para a mensagem de validação “is an invalid date” da seguinte forma:
No arquivo config/locales/pt-BR.yml adicionei o atributo invalid_date:
pt-BR:
# Active Record
activerecord:
errors:
messages:
invalid_date: "é uma data inválida"
e no model eu configurei da seguinte forma:
class Investor < ActiveRecord::Base
validates_date :date_of_birth, :message => I18n.t('activerecord.errors.messages.invalid_date')
end
O plugin também trabalha com validações time e date time, nos formatos: 1pm ou 10:11 ou 12:30pm ou 8am e 1 Jan 2006 2pm ou 31/1/06 8:30am.
Se você gostou desse texto e acha que ajudou você, me recomende:
.