2012-04-17 4 views
10

Stiamo usando il seguente per verificare se stock_qty (un intero o un float potrebbe essere zero ma non nullo.) È maggiore o uguale a zero:: greater_than_or_equal_to in validates_numericality_of solo parzialmente lavora in rotaie 3,1

validates_numericality_of :stock_qty, :greater_than_or_equal_to => 0 
validates_numericality_of :stock_qty, :less_than_or_equal_to => :in_qty, :if => Proc.new { |part| !part.in_qty.nil? } 

: in_qty è una colonna nel modello di parte. Questa convalida dovrebbe consentire positivo o 0 per: stock_qty. Il problema è che rspec non è riuscito se: stock_qty è stato assegnato zero. Ho notato che: less_than_or_equal_to ha permesso solo less_than e non ha permesso equal_to. C'è un modo per convalidare il> = o < = in rotaie 3.1? O cosa potrebbe andare storto con il nostro codice di convalida qui sopra. Grazie mille.

+0

Il codice di cui sopra sembra tutto a posto ... – user938363

risposta

15

prova ad aggiungere :only_integer => true in questo modo:

validates_numericality_of :stock_qty, :only_integer => true, :greater_than_or_equal_to => 0 

EDIT

se questo deve passare quando stock_qty è nullo o azzerare è necessario modificare il codice per questo:

validates_numericality_of :stock_qty, :allow_nil => true, :greater_than_or_equal_to => 0 
validates_numericality_of :stock_qty, :allow_nil => true, :less_than_or_equal_to => :in_qty, :if => Proc.new { |part| !part.in_qty.nil? } 
+0

Appena aggiunto: stock_qty potrebbe essere o numero intero o float. Grazie. – user938363

+0

: only_integer => true non ha modificato il risultato rspec. – user938363

+0

Questo test deve passare se stock_qty è nullo o zero? –

1

anche potresti credere che ci fossero 0 mentre c'erano nil. nil non supererà questo controllo.

+0

Intendevi che zero e zero sono trattati allo stesso modo nella convalida? – user938363

+0

No, esattamente il contrario: si potrebbe scrivere qualcosa come "Model1.new.valid?" E ottenere 'false' mentre' Stock_qty' era 'nil'. Questa è l'unica spiegazione che viene in mente (perché spero che tu non abbia fatto un'altra convalida per il tuo modello che fallisce e te ne sei dimenticato). – jdoe

7
validates :stock_qty, :numericality => { :only_integer => true, :greater_than_or_equal_to => 0 } 

funziona nel mio 3.1 app, nel mio caso devo prezzo, e quando aggiornare o aggiungere il prodotto wthout prezzo che ho ottenuto il "non è un numero" errore, o qualcosa del genere, ma posso inserisci una colonna di prezzo pari a 0 e si aggiorna bene. spero che questo ti aiuti.

: greater_than_or_equal_to – Specifica che il valore deve essere maggiore o uguale al valore fornito. Il messaggio di errore predefinito per questa opzione è "deve essere maggiore o uguale a% {count}".

http://guides.rubyonrails.org/active_record_validations_callbacks.html

+0

Provato esattamente lo stesso usando convalida, rspec ancora fallito con stock_qty == 0. Grazie. – user938363

+0

Tuttavia nella console di rails, è OK salvare un record con 0 stock_qty. Sembra che rspec non sia riuscito, ma il modello attuale è passato. Strano! – user938363