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?
ruby-on-rails
ruby
validation
model
bgadoci
źródło
źródło
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
źródło
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.
źródło
in
, że będzie działać ze stringami, wydaje się być tylko liczbamivalidates :foo, length: 2..5, allow_blank: true
ale `length: {is: 5}` wystarczy w przypadku OPZ dokumentacji validates_length_of :
validates_length_of :phone, :in => 7..32, :allow_blank => true
źródło
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?}
źródło
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) }
źródło
Co ty na to:
validates_length_of :foo, is: 3, allow_blank: true
źródło
Dodaj swój model:
validates :color, length: { is: 7 }
kolor to ciąg:
t.string :color, null: false, default: '#0093FF', limit: 7
źródło
W Twoim modelu np
def validate errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc? end
źródło