2011-11-21 12 views

Odpowiedz

0

kody pocztowe w Stanach Zjednoczonych są znakami 5 cyfr lub 5 cyfr plus 4 cyfry dla numerem kierunkowym. Spróbuj wykonać następujące czynności:

validates_format_of :zip_code, 
        :with => %r{\d{5}(-\d{4})?}, 
        :message => "should be 12345 or 12345-1234" 
+0

Dzięki, ale kiedy wstawiam 123456 potwierdzam, że jest OK –

+1

ohh - mam kolejną szansę - proszę sprawdzić mój. Usunąłem odwołanie do tego i dodałem własne wyrażenie regularne, aby wypróbować- ': with =>/^ \ d {5} (- \ d {4})? $ /' –

+0

Nie działa dla "3702" kod pocztowy: – Dorian

20

Można również potwierdzić, że to jest rzeczywiście ważne zip (nie tylko format, ale sam zip) przy użyciu:
http://www.webservicex.net/uszip.asmx?op=GetInfoByZIP

spróbować ważnego zip znasz, np 02135 kontra nieważny jak 09990, aby zobaczyć różnicę.

uważam łącząc to z:

validates_format_of :zip, :with => /^\d{5}(-\d{4})?$/, :message => "should be in the form 12345 or 12345-1234" 

że jest to zrobione z validate_format_of, zamiast validate_format_of_zip_code a to znaczy, że mogą być również wykorzystywane do numerów telefonów, etc, które pasują także stałą, znaną, format (.eg USA).
Możliwe, że najpierw sprawdzi poprawność formatu i poda błąd, jeśli jest nieprawidłowy, więc obsłuż go w szyny standardową wiadomością błyskawiczną.
Następnie, jeśli jest prawidłowe, wykonaj połączenie z tym serwerem, aby sprawdzić autentyczność samego pliku ZIP.

Jedynym minusem takich sprawdzonych poprawności serwera jest to, że zwiększają one zależność od innych witryn i usług. Więc jeśli druga witryna/usługa zmienia rzeczy lub jest niedostępna, itp. Istnieje problem. Jest to kolejny powód, dla którego prostsze sprawdzanie poprawności jest doskonałym pomysłem.

Pełne rozwiązanie serwisowe również sprawdzałoby czas oczekiwania przez usługę kodu pocztowego, a jeśli tak się stanie, powiedzmy 5 sekund, a format jest w porządku, najlepiej przyjąć wartość. Może ustawić flagę "unverified_zip", jeśli to możliwe!

+2

Jeśli używasz wyrażeń regularnych, linie dopasowania "^" i "$" (tekst między znakami nowego wiersza) zamiast całego ciągu znaków. Użycie '\ A' zamiast"^"i' \ z' zamiast "$" zapewni, że cały łańcuch jest poprawny. –

+0

Oto link do dłuższego wyjaśnienia @aron dał na swój komentarz http://aaronlasseigne.com/2016/06/10/proper-regexp-anchoring/?utm_source=rubyweekly&utm_medium=email – Calin

+0

Nie działa dla "3702" kod pocztowy – Dorian

10

Ten pracował dla mnie: (Ruby-2.0.0-p247, szyn 4.0.0)

validates_format_of :zip_code, 
        with: /\A\d{5}-\d{4}|\A\d{5}\z/, 
        message: "should be 12345 or 12345-1234", 
        allow_blank: true 

Życzenie.

+0

Poza tym, że 3702 jest prawidłowym kodem pocztowym na przykład. – Dorian

3

Jeśli potrzebujesz pomocy w wielu krajach, możesz użyć wydanego klejnotu validates_zipcode. Obecnie obsługuje formaty zipcode 159 krajów i gra z Railsami 3 & 4.

Można go używać tak:

class Address < ActiveRecord::Base 
    validates_zipcode :zipcode 
    validates :zipcode, zipcode: true 
    validates :zipcode, zipcode: { country_code: :ru } 
    validates :zipcode, zipcode: { country_code_attribute: :my_zipcode } 
end 
Powiązane problemy