Dubbio su validates_numericality_of

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.

Il 20 febbraio 2010 18.51, Mauro [email protected] 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

Il 20 febbraio 2010 21.49, Mauro [email protected] 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

2010/2/20 Pietro G. [email protected]:

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?

Il 21 febbraio 2010 10.49, Andrea L. [email protected] 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

Msan M. 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

2010/2/21 Pietro G. [email protected]:

Il 21 febbraio 2010 10.49, Andrea L. [email protected] 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.

Msan M. 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}$/

Il 22 febbraio 2010 02.09, Andrea L. [email protected] 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

2010/2/21 Andrea L. [email protected]:

Msan M. 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.

2010/2/22 Andrea L. [email protected]:

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?

Il 22 febbraio 2010 23.10, Mauro [email protected] 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

Msan M. 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