Quiero validar una fecha en mi modelo en Ruby on Rails, sin embargo, los valores de día, mes y año ya se han convertido en una fecha incorrecta cuando llegan a mi modelo.
Por ejemplo, si introduzco el 31 de febrero de 2009 en mi vista, cuando lo uso Model.new(params[:model])
en mi controlador, lo convierte a "3 de marzo de 2009", que mi modelo ve como una fecha válida, que es, pero es incorrecta.
Me gustaría poder hacer esta validación en mi modelo. ¿Hay alguna manera de que pueda, o estoy haciendo esto completamente mal?
Encontré esta " Validación de fecha " que analiza el problema, pero nunca se resolvió.
ruby-on-rails
ruby
validation
date
Megamug
fuente
fuente
Respuestas:
Supongo que está utilizando el
date_select
asistente para generar las etiquetas para la fecha. Otra forma de hacerlo es utilizar el asistente de formulario de selección para los campos de día, mes y año. Así (el ejemplo que utilicé es el campo created_at date):Y en el modelo, valida la fecha:
Si está buscando una solución de complemento, verificaría el complemento validates_timeliness . Funciona así (desde la página de github):
La lista de métodos de validación disponibles es la siguiente:
fuente
Usando la gema crónica:
fuente
Chronic.parse(from_date_before_type_cast)
para obtener la entrada del valor de la cadena. De lo contrario, Rails encasillaría la cadena conto_date
ya que el campo era undatetime
campo.Si desea compatibilidad con Rails 3 o Ruby 1.9, pruebe la gema date_validator .
fuente
Active Record le proporciona
_before_type_cast
atributos que contienen los datos de atributos sin procesar antes de encasillar. Esto puede ser útil para devolver mensajes de error con valores pre-encasillados o simplemente para hacer validaciones que no son posibles después de encasillar.Me alejaría de la sugerencia de Daniel Von Fange de anular el acceso, porque hacer la validación en un acceso cambia ligeramente el contrato del acceso. Active Record tiene una función explícita para esta situación. Úselo.
fuente
Dado que necesita manejar la cadena de fecha antes de que se convierta a una fecha en su modelo, anularía el descriptor de acceso para ese campo
Digamos que su campo de fecha es
published_date
. Agregue esto a su objeto modelo:fuente
Un poco tarde aquí, pero gracias a " ¿Cómo valido una fecha en rieles? " Logré escribir este validador, espero que sea útil para alguien:
Dentro de tu
model.rb
fuente
Aquí hay una respuesta no crónica ...
fuente
"1/1/2013".is_a?(Date)
- La fecha proviene de la entrada del usuario, por lo que se alimenta como una cadena. ¿Primero tendría que analizarlo como una fecha?Date.parse("1/1/2013").is_a?(Date)
, pero puede ver que si no analiza en absoluto, probablemente tampoco sea una fecha.Puede validar la fecha y la hora así (en un método en algún lugar de su controlador con acceso a sus parámetros si está utilizando selecciones personalizadas) ...
fuente
¿Has probado el
validates_date_time
complemento?fuente