Nel modello ho: validates_numericality_of :CAP, :only_integer => true. Mi permette di inserire valori quali 00444. Mi suona strano, avendo only_integer => true dovrebbe darmi un errore o quantomeno tagliarmi gli zeri iniziali.
on 2010-02-20 18:51
on 2010-02-20 19:57
Il 20 febbraio 2010 18.51, Mauro <mrsanna1@gmail.com> ha scritto: > Nel modello ho: > validates_numericality_of :CAP, :only_integer => true. > Mi permette di inserire valori quali 00444. > Mi suona strano, avendo only_integer => true dovrebbe darmi un errore > o quantomeno tagliarmi gli zeri iniziali. per curiosità ho guardato il codice: if configuration[:only_integer] unless raw_value.to_s =~ /\A[+-]?\d+\Z/ record.errors.add(attr_name, :not_a_number, :value => raw_value, :default => configuration[:message]) next end raw_value = raw_value.to_i else begin raw_value = Kernel.Float(raw_value) rescue ArgumentError, TypeError record.errors.add(attr_name, :not_a_number, :value => raw_value, :default => configuration[:message]) next end end In effetti calcola raw_value, ma lo usa solo per controlli (:even, :odd...), poi non è quello ciò che viene inserito nel record. pietro
on 2010-02-20 21:49
2010/2/20 Pietro Giorgianni <giorgian@gmail.com>: > unless raw_value.to_s =~ /\A[+-]?\d+\Z/ > :default => configuration[:message]) > next > end > end > > In effetti calcola raw_value, ma lo usa solo per controlli (:even, > :odd...), poi non è quello ciò che viene inserito nel record. Non ho capito, cos'e' che non viene inserito nel record?
on 2010-02-20 22:06
Il 20 febbraio 2010 21.49, Mauro <mrsanna1@gmail.com> ha scritto:
> Non ho capito, cos'e' che non viene inserito nel record?
Hai ragione, provo a riformulare in Italiano.
Il metodo validates_numericality_of, in effetti, calcola il valore
numerico del campo da validare: raw_value = raw_value.to_i, poi usa
questo valore per i suoi controlli, ma lasciando inalterato il campo
del record da salvare.
In pratica, specificando soltanto :only_integer, l'unico controllo che
viene effettuato è che il campo sia =~ /\A[+-]?\d+\Z/ (ovvero:
composto eventualmente da un + o un - iniziale e poi solo da cifre).
Quindi, ad esempio, -0000000 passa la validazione.
pietro
on 2010-02-21 10:49
Msan Msan wrote: > Nel modello ho: > validates_numericality_of :CAP, :only_integer => true. > Mi permette di inserire valori quali 00444. > Mi suona strano, avendo only_integer => true dovrebbe darmi un errore > o quantomeno tagliarmi gli zeri iniziali. La colonna nel db è varchar? Se la cambi ad integer dovrebbe toglierti tutti gli zeri. Secondo me se CAP indica il codice di avviamento postale si tratta di una stringa, e quindi il metodo più adatto per controllarne il formato è validates_format_of
on 2010-02-21 11:38
Il 21 febbraio 2010 10.49, Andrea Longhi <andrea74@mailshack.com> ha scritto: > Secondo me se CAP indica il codice di avviamento postale > si tratta di una stringa, e quindi il metodo più adatto per controllarne > il formato è validates_format_of concordo. pietro
on 2010-02-22 00:28
2010/2/21 Andrea Longhi <andrea74@mailshack.com>: > Msan Msan wrote: >> Nel modello ho: >> validates_numericality_of :CAP, :only_integer => true. >> Mi permette di inserire valori quali 00444. >> Mi suona strano, avendo only_integer => true dovrebbe darmi un errore >> o quantomeno tagliarmi gli zeri iniziali. > > La colonna nel db è varchar? Si.
on 2010-02-22 00:32
2010/2/21 Pietro Giorgianni <giorgian@gmail.com>: > Il 21 febbraio 2010 10.49, Andrea Longhi <andrea74@mailshack.com> ha scritto: >> Secondo me se CAP indica il codice di avviamento postale >> si tratta di una stringa, e quindi il metodo più adatto per controllarne >> il formato è validates_format_of > > concordo. Nel database CAP e' un varchar, se uso validates_numericality_of mi assicuro che vengano inseriti solo numeri.
on 2010-02-22 02:09
Msan Msan wrote: > Nel database CAP e' un varchar, se uso validates_numericality_of mi > assicuro che vengano inseriti solo numeri. I CAP in Italia sono composti da 5 numeri. Se l'utente ne inserisce 6? Sono sempre solo numeri, e validates_numericality_of non ti protegge da questo genere di errori, dovrai aggiungere un'altra validazione (probabilmente validates_length_of). Fai prima e meglio con validates_format_of :cap, :with => /^\d+{5}$/
on 2010-02-22 07:23
Il 22 febbraio 2010 02.09, Andrea Longhi <andrea74@mailshack.com> ha
scritto:
> Fai prima e meglio con validates_format_of :cap, :with => /^\d+{5}$/
Tra l'altro, a Roma, i CAP iniziano con 001...
pietro
on 2010-02-22 23:10
2010/2/22 Andrea Longhi <andrea74@mailshack.com>:
> Fai prima e meglio con validates_format_of :cap, :with => /^\d+{5}$/
Ho sostituito la validazione cosi' come mi hai indicato.
Com'e' che il cap mi accetta valori anche di 3 numeri anziche' solo di
5 come indicato nel pattern?
on 2010-02-22 23:23
Il 22 febbraio 2010 23.10, Mauro <mrsanna1@gmail.com> ha scritto: >> Fai prima e meglio con validates_format_of :cap, :with => /^\d+{5}$/ > > Ho sostituito la validazione cosi' come mi hai indicato. > Com'e' che il cap mi accetta valori anche di 3 numeri anziche' solo di > 5 come indicato nel pattern? A me /^\d{5}$/ funziona... pietro
on 2010-02-23 02:40
Msan Msan wrote: > Com'e' che il cap mi accetta valori anche di 3 numeri anziche' solo di > 5 come indicato nel pattern? Boh, ma mi era scappato un + nella regex. Per il resto dai miei test sembra corretta: require 'test/unit' class TestCAP < Test::Unit::TestCase def setup @regex = /^\d{5}$/ end def test_5_digits_should_match assert_match @regex, '01234' end def test_4_digits_should_not_match assert_no_match @regex, '1234' end def test_6_digits_should_not_match assert_no_match @regex, '123456' end def test_mixed_alphanumerics_should_not_match assert_no_match @regex, '123a5' end end
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.