2011-04-14 33 views
7

Tengo un modelo de registro activo que contiene dos atributos: start_date y end_date. ¿Cómo hago para validar los siguientes:Fecha de validación en Rails

  1. Las fechas están en la correcta (aaaa-mm-dd) Formato
  2. Eso fecha_final> fecha_inicial

Respuesta

1

Aquí está cómo hacerlo validación de fechas:

How do I validate a date in rails?

y ver si una fecha es superior a otra fecha, sólo puede utilizar la mayor/menor que los operadores sobre los objetos de fecha:

ruby-1.9.2-p136 :006 > d1 = Date.civil(2011, 05, 01) 
=> #<Date: 2011-05-01 (4911365/2,0,2299161)> 
ruby-1.9.2-p136 :007 > d2 = Date.civil(2011, 01, 01) 
=> #<Date: 2011-01-01 (4911125/2,0,2299161)> 
ruby-1.9.2-p136 :008 > d2 > d1 
=> false 
ruby-1.9.2-p136 :009 > d2 < d1 
=> true 

Así que en su ejemplo:

def validate_dates 
    errors.add("Created at date", "is invalid.") unless convert_created_at 
    errors.add("End Date" , "is invalid") if end_date > start_date 
end 
21

¿Es importante el formato que se almacenan en? Un objeto Date es un objeto Date. ¿Lo está almacenando en una columna de fecha en el DB?

Aquí es cómo hacer la validación:

class MyModel < ActiveRecord::Base 
    validate :validate_end_date_before_start_date 

    def validate_end_date_before_start_date 
    if end_date && start_date 
     errors.add(:end_date, "Put error text here") if end_date < start_date 
    end 
    end 
end 

Tenga en cuenta que esto no comprueba las fechas nil ... es posible que desee, si bien podría ser.

Para su información, si quiere ser capaz de aceptar una variedad de formatos, Chronic es bastante flexible.

+0

Bien, estoy poblando mi objeto "MyModel" en la acción del controlador con la siguiente línea de código: MyModel = MyModel.new (params [: MyModel]) supongo que está estableciendo el fecha_inicial y end_date como cadenas. Supongo que podría convertir manualmente los params [: start_date] y params [: end_date] para fechar objetos primero antes de almacenarlos en mi modelo. ¿Es eso lo que recomendarías? (y sí, los estoy almacenando en columnas de fecha en el db) –

+1

puede pasar las fechas como cadenas del hash de params sin ningún problema ... se convertirán en objetos Date automáticamente. Pero una pequeña advertencia: si pasa una secuencia como 01-04-1990, no se interpretará como el 4 de enero de 1990 sino como el 1 de abril de 1990. Sin embargo, AAAA-MM-DD no es ambiguo y se analizará correctamente. – brettish

+0

Gracias. Sí, me encontré con el problema de mm/dd/aaaa frente a dd/mm/aaaa. Decidí simplemente pedir la entrada del usuario en el formato aaaa-mm-dd. –

Cuestiones relacionadas