2012-05-18 15 views
5

Piszę niestandardowy walidator w ActiveRecord tak że termin sens:szyn: Members Date większa od drugiej

validate :deadline_is_possible? 

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

To jednak generuje „NoMethodError: Metoda niezdefiniowana`>”do zera: NilClass ". Wydarzenie próbowało zmienić daty w ciągi znaków, na przykład:

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

i chociaż nie generuje błędu, nie działa.

oświadczyłem również inne weryfikatorów (jak

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

że działa OK.

Odpowiedz

1

Jest skarży ponieważ deadline jest zerowa. Wydrukuj go, aby potwierdzić to jest problem.

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

Prawdopodobnie musisz obsłużyć, jeśli jedna z dat jest zerowa. Możesz ustawić te wartości domyślne w bazie danych ostatecznych terminów lub wykonać coś takiego:

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

Eliminuje to błąd, ale to nie działa zgodnie z oczekiwaniami: '@ event.deadline = @ event.begins_at + 1.day;' '@event.should_not be_valid' powraca ważny. .. Czy powinienem wybrać bardziej konkretny klejnot do wykonania pracy? – piffy

+0

poprawiam się: powyższy kod działa, natomiast to nie: '@ event.deadline = @ event.begins_at;' '@event.should be_valid' zyski nie ważne ... – piffy

+0

To może być wprowadzające w błąd ... czy wypróbowałbyś '@ event.deadline = @ event.begins_at; @ event.should mieć (0) .errors_on (: deadline) ' –