2011-11-21 9 views

risposta

0

Codici di avviamento postale degli Stati Uniti sono o 5 cifre o 5 cifre più 4 cifre per il prefisso. Provare quanto segue:

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

Grazie, ma quando ho messo 123456 convalida che è ok –

+1

ohh - ho un'altra possibilità - per favore controlla la mia. Ho rimosso il riferimento a questo e aggiunto il mio regexp per voi per provare-:: con =>/^ \ d {5} (- \ d {4})? $/' –

+0

Non funziona per" 3702 " codice di avviamento postale – Dorian

20

È anche possibile convalidare che in realtà è una zip valido (non solo il formato, ma la zip stesso) utilizzando:
http://www.webservicex.net/uszip.asmx?op=GetInfoByZIP

Prova una zip valida si sa, ad esempio, 02135 contro uno non valido come 09990 per vedere la differenza.

vorrei prendere in considerazione che unisce questo con:

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

che è fatto con validate_format_of, piuttosto che validate_format_of_zip_code come questo significa che può essere utilizzato anche per i numeri di telefono, ecc che anche montare un, noto, formato fisso (.eg US).
Forse convalidare prima il formato e fornire un errore se non valido, quindi gestirlo tutto in rotaie con un messaggio flash standard.
Quindi, se valido, effettuare la chiamata a quel server per convalidare lo stesso zip vero e proprio.

L'unico lato negativo delle convalide fornite dal server è che aumenta la dipendenza da altri siti e servizi. Quindi se l'altro sito/servizio cambia le cose o non è disponibile, ecc. C'è un problema. Questo è un altro motivo per cui il semplice controllo della validità prima è una grande idea.

Una soluzione di servizio completo dovrebbe anche verificare il timeout tramite il servizio di codice di avviamento postale e se ciò accade, diciamo 5 secondi e il formato è ok probabilmente è meglio accettare il valore. Magari imposta un flag 'unverified_zip' se possibile!

+2

Se si utilizza un'espressione regolare, '^' e '$' corrispondono a linee (testo tra caratteri di nuova riga) anziché all'intera stringa. L'uso di '\ A' al posto di'^'e' \ z' al posto di '$' assicurerà che l'intera stringa sia valida. –

+0

Ecco il link alla spiegazione più lunga @aron ha dato il suo commento http://aaronlasseigne.com/2016/06/10/proper-regexp-anchoring/?utm_source=rubyweekly&utm_medium=email – Calin

+0

Non funziona per "3702" codice di avviamento postale – Dorian

10

Questo ha funzionato per me: (ruby-2.0.0-P247, rotaie 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 

Desideri è utile.

+0

Tranne che 3702 è un codice di avviamento postale valido, ad esempio. – Dorian

3

Se è necessario il supporto per più paesi, è possibile utilizzare la gemma validates_zipcode rilasciata. Attualmente supporta i formati 159 paesi e funziona bene con Rails 3 & 4.

Si può usare in questo modo:

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 
Problemi correlati