Rails:文字列の最小長と最大長を検証しますが、空白にすることはできます


87

検証したいフィールドがあります。フィールドを空白のままにできるようにしたいのですが、ユーザーがデータを入力する場合は、特定の形式にする必要があります。現在、モデルで以下の検証を使用していますが、これではユーザーが空白のままにすることはできません。

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

目標を達成するためにこれをどのように書くのですか?

回答:



130

次の形式を使用することもできます。

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

または、最小値と最大値が同じであるため、以下も機能します。

validates :foo, length: {is: 5}, allow_blank: true


11

または、検証ドキュメントから、さらに簡潔に(新しいハッシュ構文を使用して):

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

上限はおそらく「in:5..20」のようなもっと意味のあるものを表すはずですが、手紙に対する質問に答えるだけです。


思わないではin文字列で動作します、数字だけのようです
ecoologic

1
これは代わりに機能validates :foo, length: 2..5, allow_blank: trueするはずですが、OPの場合は `length:{is:5}`で機能します
PhilT 2016

3

すべてのvalidates_ *は:ifまたは:unlessオプションを受け入れます

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

ここで、validate_foo_conditionはtrueまたはfalseを返すメソッドです。

Procオブジェクトを渡すこともできます。

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}

2
validates_length_of :reason, minimum: 3, maximum: 30

同じためのrspecは

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }

2

どのようにそのことについて: validates_length_of :foo, is: 3, allow_blank: true



-4

あなたのモデルでは例えば

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.