web-dev-qa-db-ja.com

文字列の最小長と最大長を検証するが、空白にすることを許可する

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

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

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

74
bgadoci

次のようなものが必要になると思います。

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

その他の例: ActiveRecord :: Validations :: ClassMethods

122
DigitalRoss

次の形式も使用できます。

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

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

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

validates_length_of documentation から:

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

:allow_blank-属性は空白にすることができます。検証をスキップします。

11
Gareth

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

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

上限は、おそらく「in:5..20」のようなより意味のある何かを表す必要がありますが、手紙への質問に答えるだけです。

8
Fellow Stranger

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

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?}
3
keymone
validates_length_of :reason, minimum: 3, maximum: 30

同じためのrspecは

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

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

2
shem

モデルを追加します。

validates :color, length: { is: 7 }

色は文字列です:

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