2011-12-14 6 views

Odpowiedz

45

Twoje pytanie jest (prawie) dokładnie odpowiedział in the Rails guides.

Oto przykład kodu, który podają. Klasa ta potwierdza, że ​​data jest w minionym, a pytanie jest jak potwierdzić, że data jest w przyszłości, lecz dostosowania powinno być dość proste:

class Invoice < ActiveRecord::Base 
    validate :expiration_date_cannot_be_in_the_past 

    def expiration_date_cannot_be_in_the_past 
    if expiration_date.present? && expiration_date < Date.today 
     errors.add(:expiration_date, "can't be in the past") 
    end 
    end  
end 
12

Oto kod, aby ustawić up niestandardowych walidatora:

#app/validators/not_in_past_validator.rb 
class NotInPastValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    if value.blank? 
     record.errors.add attribute, (options[:message] || "can't be blank") 
    elsif value <= Time.zone.today 
     record.errors.add attribute, 
         (options[:message] || "can't be in the past") 
    end 
    end 
end 

a w modelu:

validates :signed_date, not_in_past: true 
+3

myślę 'in_future' jest ładniejszy –

1

wziąłem odpowiedź @dankohn i zaktualizowany, aby był gotowy do użycia przez I18n. Usunąłem również test blank, ponieważ nie jest to odpowiedzialnością tego walidatora i można go łatwo włączyć, dodając presence: true do połączenia sprawdzania poprawności.

Zaktualizowana klasa, teraz nazwany in_future, co moim zdaniem jest ładniejsza niż not_in_past

class InFutureValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    record.errors.add(attribute, (options[:message] || :in_future)) unless in_future?(value) 
    end 

    def in_future?(date) 
    date.present? && date > Time.zone.today 
    end 
end 

Teraz dodać klucz in_future do pliku lokalizacyjnego.

Dla wszystkich pól pod numerem errors.messages.in_future, np. w przypadku języka niderlandzkiego:

nl: 
    errors: 
    messages: 
     in_future: 'moet in de toekomst zijn' 

Lub w polu pod numerem activerecord.errors.models.MODEL.attributes.FIELD.in_future, np. dla end_date w A Vacancy modelu w języku polskim:

nl: 
    activerecord: 
    errors: 
     models: 
     vacancy: 
      attributes: 
      end_date: 
       in_future: 'moet in de toekomst zijn' 
+0

Kiedy to mogę zrobić: Nieznany walidator:„InFutureValidator” –

+0

Gdzie zapisać ten plik? Proponuję zapisać go w 'app/validators/in_future_validator.rb' –

+0

W zasadzie to samo, może poza tym, że używam DateTime i używam Rails 5. –

0

Najprostszym rozwiązaniem jest pracować i korzystać z wbudowanej walidacji z Rails. Tylko potwierdza to tak:

validates :expiry_date, inclusion: { in: (Date.today..Date.today+5.years) } 
+4

uważaj - daty zostaną ustalone, kiedy kod zostanie załadowany (np. Instancja szyny uruchomiona) –

+2

następnie zamień na 'in: -> (date) {(Date.today..Date.today + 5.years)} – hlcs

Powiązane problemy