Forum: Italian Ruby user group dubbio su validates_numericality_of.

Posted by Msan Msan (msan)
on 2010-02-20 18:51
(Received via mailing list)
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.
Posted by Pietro Giorgianni (giorgian)
on 2010-02-20 19:57
(Received via mailing list)
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
Posted by Msan Msan (msan)
on 2010-02-20 21:49
(Received via mailing list)
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?
Posted by Pietro Giorgianni (giorgian)
on 2010-02-20 22:06
(Received via mailing list)
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
Posted by Andrea Longhi (andrea)
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



Posted by Pietro Giorgianni (giorgian)
on 2010-02-21 11:38
(Received via mailing list)
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
Posted by Msan Msan (msan)
on 2010-02-22 00:28
(Received via mailing list)
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.
Posted by Msan Msan (msan)
on 2010-02-22 00:32
(Received via mailing list)
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.
Posted by Andrea Longhi (andrea)
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}$/
Posted by Pietro Giorgianni (giorgian)
on 2010-02-22 07:23
(Received via mailing list)
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
Posted by Msan Msan (msan)
on 2010-02-22 23:10
(Received via mailing list)
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?
Posted by Pietro Giorgianni (giorgian)
on 2010-02-22 23:23
(Received via mailing list)
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
Posted by Andrea Longhi (andrea)
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
No account? Register here.