validatesで数値の以上以下指定でつまった話
プログラミングを本格的にスタートして4ヶ月目に入りましたさかもとです。
今回はint属性の〜以上〜以下のバリデーションがかからなかった!という話をアウトプットしようと思います。
成り行き
課題
「int属性のwideカラムを追加し、100〜200のみ入力可能になるようバリデーションを設定してください」
私
「余裕ですね。validates :width, length { minimum: 100, maximum: 200 } これで100~200の間の数値しか受け付けないはず」
ブラウザで確認
。。。バリデーションが全くかからない
私
「????????」
原因
今回私がこのような状態になった理由として数値の有無はlength{ minimum: maximum}で図るものだと認識していたからでした。
解決
一つ一つ整理していきます。
①length{ minimum: maximum}は数値の有無を図るものではない
これは文字数の制限をかけるvalidatesです。つまりint属性のカラムに対して働くものではないということ。string型やtext型に働きかけるものです。
②数値の最低最高を定めるバリデーション
numericality: {~} : 属性に対して数値のみ使われているか確認します。
デフォルトでは整数値、少数関係なく作用します。
greater_than_or_equal_to : その数値を含むないしそれ以上の値であるか検証。
less_than_or_equal_to : その数値を含むないしそれ以下の値であるかを検証。
greater_than : その数値より大きいかを検証(その数値は含まない)
less_than : その数値より小さいかを検証(その数値は含まない)
結果
以上のことから今回は
```
validates :width, numericality: { greater_than_or_equal_to : 100,less_than_or_equal_to: 200 }
```
このように記述してあげるのが正しい方法でした。
まとめ
他にも数値のバリデーションに関してはいくつか種類があったので下記URLから随時確認していこうと思います。
参考記事