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?

Odpowiedzi:



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

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.


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


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?}

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) }

2

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


-1

Dodaj swój model:

validates :color, length: { is: 7 }

kolor to ciąg:

t.string :color, null: false, default: '#0093FF', limit: 7

-4

W Twoim modelu np

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.