2011-11-02 9 views
55

Próbuję zapisać rekord, który nie ma jednego zestawu pól - który ma walidację numeryczną w modelach. Mimo że obecność nie jest wymagana podczas sprawdzania poprawności, to nadal generuje błąd, że pole nie jest liczbą.Sprawdzanie poprawności linii kolejowych wymagało numerowania, mimo że obecność nie jest ustawiona na true

Walidacja:

validates :network_id, :numericality => true 

Kod do tego jest oszczędność model:

networks.each do |network| 
    network.url = network.raw_data.link 
    network.save! 
end 

Błąd:

Validation failed: Network is not a number 

Odpowiedz

108
validates :network_id, :numericality => true, :allow_nil => true 
+1

sama odpowiedź, o tej samej godzinie => +1 – apneadiving

+0

@Unixmonkey byłoby to potrzebne dla każdego pola w bazie danych, które pozwala na wartości null? lub czy jest sposób, aby szyny radziły sobie z tym automatycznie (wydaje się, że jest to ból, który powoduje, że albo ustawiasz obecność, albo allow_nil). – Hopstream

+0

@Hopstream Jeśli sprawdzasz poprawność numeryczną, to zero nie jest wartością liczbową. Musisz wyraźnie na to pozwolić. Nie musisz tego robić dla wszystkich pól. – Unixmonkey

14

Należy użyć allow_blank

validates :network_id, :numericality => true, :allow_blank => true 
+0

o człowieku - myślałem, że zero jest domyślne. Czy powinienem dodać to do wszystkich pól, które mogą być zerowe? rodzaj wydaje się zbędny na części szyn. – Hopstream

+1

@apneadiving Mogę się mylić ... powinno to być 'validates: network_id,: numericality => {: allow_blank => true}', czyż nie? –

+0

@Hopstream: spójrz na mój link: Opcja: allow_blank jest podobna do opcji: allow_nil – apneadiving

38
validates :network_id, :numericality => {:allow_blank => true} 
+3

Myślę, że to był właściwy sposób, aby go napisać, +1 następnie – apneadiving

+0

Jest to bardziej przydatna odpowiedź –

+0

To jest rzeczywiście lepsze jak zezwala na puste ciągi: http://edgeguides.rubyonrails.org/active_record_validations.html#allow-blank – Hopstream

9

W Rails 4 (Ruby 2), można napisać:

validates :network_id, numericality: { greater_than_or_equal_to: 0, allow_nil: true } 
+2

Nie wiem, dlaczego to nie działa dla mnie. Używam Rails 4.2. Dzięki tej walidacji mogę zapisywać wartości zerowe, ale także zezwalać na zapisywanie ciągu znaków. – leandrotk

0

Można również napisać jak to ...

validates_numericality_of :network_id, allow_nil: true 
Powiązane problemy