Schienen: Überprüfen der minimalen und maximalen Länge einer Zeichenfolge, wobei diese jedoch leer sein darf

82

Ich habe ein Feld, das ich validieren möchte. Ich möchte, dass das Feld leer gelassen werden kann, aber wenn ein Benutzer Daten eingibt, möchte ich, dass es in einem bestimmten Format vorliegt. Derzeit verwende ich die folgenden Validierungen im Modell, aber der Benutzer kann es nicht leer lassen:

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

Wie schreibe ich das, um mein Ziel zu erreichen?

bgadoci
quelle

Antworten:

132

Ich denke, es könnte etwas brauchen wie:

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

Weitere Beispiele: ActiveRecord :: Validations :: ClassMethods

DigitalRoss
quelle
7
Für eine bestimmte Größe können Sie die Längenbeschränkung verwenden: is
GuiGreg
125

Sie können auch dieses Format verwenden:

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

Oder da Min und Max gleich sind, funktioniert auch Folgendes:

validates :foo, length: {is: 5}, allow_blank: true
quainjn
quelle
10

Oder noch prägnanter (mit der neuen Hash-Syntax) aus der Validierungsdokumentation :

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

Die Obergrenze sollte wahrscheinlich etwas Bedeutenderes wie "in: 5..20" darstellen, aber nur die Frage auf den Brief beantworten.

Fremder
quelle
In nicht denken inwird mit Strings funktionieren, scheint nur Zahlen zu sein
ecoologic
1
Dies sollte stattdessen funktionieren, validates :foo, length: 2..5, allow_blank: trueaber `length: {is: 5}` würde im Fall des OP
ausreichen
3

jeder validates_ * akzeptiert: if oder: es sei denn Optionen

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

Dabei ist validate_foo_condition eine Methode, die true oder false zurückgibt

Sie können auch ein Proc-Objekt übergeben:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}
Keymone
quelle
2
validates_length_of :reason, minimum: 3, maximum: 30

rspec für das gleiche ist

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }
Shiva Kumar
quelle
2

Wie wär es damit: validates_length_of :foo, is: 3, allow_blank: true

shem
quelle
-1

Fügen Sie Ihrem Modell hinzu:

validates :color, length: { is: 7 }

Farbe ist eine Zeichenfolge:

t.string :color, null: false, default: '#0093FF', limit: 7
Marlon Henry Schweigert
quelle
-4

In Ihrem Modell zB

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Codevoice
quelle