2012-05-18 28 views
5

Estoy escribiendo un validador personalizado en ActiveRecord por lo que el plazo tiene sentido:Rieles: Validación de una fecha mayor que otro

validate :deadline_is_possible? 

    def deadline_is_possible? 
    if deadline > begins_at 
     errors.add(:deadline, 'must be possible') 
    end 
    end 

Sin embargo, esto genera un "NoMethodError: método no definido`>' para nada: NilClass ". Me evento trató de convertir las fechas en cadenas, como:

def deadline_is_possible? 
    if deadline.to_s > begins_at.to_s 
     errors.add(:deadline, 'must be possible') 
    end 
    end 

y aunque no genera un error, no funciona bien.

También declararon otros validadores (como

def begins_at_is_date? 
    if !begins_at.is_a?(Date) 
     errors.add(:begins_at, 'must be a date') 
    end 
    end 

que funciona bien.

Respuesta

1

Se quejaba de que deadline es nula. Imprimir para confirmar esto es el problema.

irb(main):001:0> nil > Date.new 
NoMethodError: undefined method `>' for nil:NilClass 
2

Es probable que necesite manejar si una de las fechas es nula. Puede establecer que tenga un valor predeterminado en la base de datos de fechas límite, o hacer algo como:

validate :deadline_is_possible? 

    def deadline_is_possible? 
    return if [deadline.blank?, begins_at.blank?].any? 
    if deadline > begins_at 
     errors.add(:deadline, 'must be possible') 
    end 
    end 
+0

Esto elimina el error, sin embargo, no funciona como se esperaba: '@ event.deadline = @ event.begins_at + 1.day;' '@event.should_not be_valid' vuelve válida. .. ¿Debería elegir una joya más específica para hacer el trabajo? – piffy

+0

me corrijo: funciona el código anterior, mientras que esto no es así: '@ event.deadline = @ event.begins_at;' '@event.should be_valid' devoluciones no válida ... – piffy

+0

Eso podría ser engañoso ... intentarías '@ event.deadline = @ event.begins_at; @ event.should have (0) .errors_on (: deadline) ' –

Cuestiones relacionadas