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
endIn 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_ofconcordo.
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