Rails: Sprawdzanie minimalnej i maksymalnej długości łańcucha, ale pozwalające na pozostawienie pustego

89

Mam pole, które chciałbym zweryfikować. Chcę, aby pole mogło pozostać puste, ale jeśli użytkownik wprowadza dane, chcę, aby były w określonym formacie. Obecnie używam poniższych walidacji w modelu, ale to nie pozwala użytkownikowi pozostawić tego pustego:

validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5

Jak to napisać, aby osiągnąć swój cel?

bgadoci
źródło

Odpowiedzi:

136

Myślę, że może potrzebować czegoś takiego:

validates_length_of :foo, minimum: 5, maximum: 5, allow_blank: true

Więcej przykładów: ActiveRecord :: Validations :: ClassMethods

DigitalRoss
źródło
7
dla określonego rozmiaru można użyć ograniczenia długości: jest
GuiGreg
133

Możesz również użyć tego formatu:

validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true

Lub, ponieważ twoje min i max są takie same, zadziała również:

validates :foo, length: {is: 5}, allow_blank: true
quainjn
źródło
12

Lub jeszcze bardziej zwięźle (z nową składnią skrótu), z dokumentacji walidacji :

validates :foo, length: 5..5, allow_blank: true

Górna granica powinna prawdopodobnie oznaczać coś bardziej znaczącego, jak „in: 5..20”, ale odpowiadać na pytanie co do litery.

Kolega nieznajomy
źródło
Nie myśl in, że będzie działać ze stringami, wydaje się być tylko liczbami
ecoologic
1
Powinno to zadziałać, validates :foo, length: 2..5, allow_blank: trueale `length: {is: 5}` wystarczy w przypadku OP
PhilT
11

Z dokumentacji validates_length_of :

validates_length_of :phone, :in => 7..32, :allow_blank => true

:allow_blank- Atrybut może być pusty; pomiń walidację.

Gareth
źródło
3

every validates_ * accepts: if lub: chyba, że ​​opcje

validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition

gdzie validate_foo_condition to metoda, która zwraca prawdę lub fałsz

możesz także przekazać obiekt Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
keymone
źródło
2
validates_length_of :reason, minimum: 3, maximum: 30

rspec za to samo jest

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
shiva kumar
źródło
2

Co ty na to: validates_length_of :foo, is: 3, allow_blank: true

shem
źródło
-1

Dodaj swój model:

validates :color, length: { is: 7 }

kolor to ciąg:

t.string :color, null: false, default: '#0093FF', limit: 7
Marlon Henry Schweigert
źródło
-4

W Twoim modelu np

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
codevoice
źródło