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から随時確認していこうと思います。

 

参考記事

 

Active Record バリデーション - Railsガイド