Quero validar uma data em meu modelo em Ruby on Rails, porém, os valores de dia, mês e ano já estão convertidos em uma data incorreta no momento em que chegam ao meu modelo.
Por exemplo, se eu inserir 31 de fevereiro de 2009 em minha visualização, quando eu usar Model.new(params[:model])
em meu controlador, ele o converterá em "3 de março de 2009", que meu modelo então vê como uma data válida, o que é, mas está incorreta.
Gostaria de poder fazer essa validação no meu modelo. Existe alguma maneira de eu poder, ou estou fazendo isso completamente errado?
Encontrei esta " Validação de data " que discute o problema, mas nunca foi resolvido.
ruby-on-rails
ruby
validation
date
Megamug
fonte
fonte
Respostas:
Suponho que você esteja usando o
date_select
auxiliar para gerar as tags para a data. Outra maneira de fazer isso é usar o auxiliar de seleção de formulário para os campos de dia, mês e ano. Assim (o exemplo que usei é o campo de data created_at):E no modelo, você valida a data:
Se você está procurando uma solução de plug-in, verificaria o plug-in validates_timeliness . Funciona assim (na página do github):
A lista de métodos de validação disponíveis é a seguinte:
fonte
Usando a gema crônica:
fonte
Chronic.parse(from_date_before_type_cast)
para obter a entrada do valor da string. Caso contrário, Rails faria um typecast da string com,to_date
já que o campo era umdatetime
campo.Se você deseja compatibilidade com Rails 3 ou Ruby 1.9, experimente a gem date_validator .
fonte
O Active Record fornece
_before_type_cast
atributos que contêm os dados de atributo brutos antes do typecasting. Isso pode ser útil para retornar mensagens de erro com valores pre-typecast ou apenas fazer validações que não são possíveis após o typecast.Eu evitaria a sugestão de Daniel Von Fange de substituir o acessador, porque fazer a validação em um acessador altera ligeiramente o contrato do acessador. O Active Record tem um recurso explicitamente para esta situação. Use-o.
fonte
Já que você precisa lidar com a string de data antes que ela seja convertida em uma data em seu modelo, eu substituiria o acessador para esse campo
Digamos que seu campo de data seja
published_date
. Adicione isto ao seu objeto modelo:fonte
Um pouco tarde aqui, mas graças a “ Como faço para validar uma data no rails? ” Consegui escrever este validador, espero que seja útil para alguém:
Dentro do seu
model.rb
fonte
Aqui está uma resposta não crônica.
fonte
"1/1/2013".is_a?(Date)
- A data vem da entrada do usuário, portanto, está sendo alimentada como uma string. Eu teria que analisar como uma data primeiro?Date.parse("1/1/2013").is_a?(Date)
, mas você pode ver que, se não analisar, provavelmente também não é uma data.Você pode validar a data e hora dessa forma (em um método em algum lugar em seu controlador com acesso aos seus parâmetros se você estiver usando seleções personalizadas) ...
fonte
Você já experimentou o
validates_date_time
plug-in?fonte