バリデーション機能は、空で保存してほしくないときや、文字数は10文字以内にしてほしいときなどに、チェックする機能として動きます。
たとえば、インスタグラムのような画像投稿サイトで、画像がないのは望ましくないので、画像は空白では保存できないようにします。
Twiiterのようなテキスト型の投稿サイトなら文字数は140字以内に設定します。
このようにバリデーション機能は、開発者の思うようなアプリ運営を行っていく上で非常に重要な機能です。
Railsではバリデーションをかんたんに実装できるので、今回はよく使うバリデーションの例を実装していきます。
#開発環境
ruby 2.6.3
Rails 5.2.6
#発動タイミング
バリデーションは、オブジェクトがデータベースに保存される前に発動して、データが正しいかどうかを確認します。
発動するメソッドは以下です
- create
- create!
- save
- save!
- update
- update!
#基本形
バリデーションはモデルでカラムを対象に書いていきます。
なのでカラムごとに自由に条件を設定できます。
validates :カラム名, 条件
#空白
####空でないこと
validates :body, presence: true
#一意性(ユニーク)
####他とかぶっていないか、オンリーワンであるか
validates :name, uniqueness: true
#長さ
####1文字以上
validates :tweet, length: { minimum: 1 }
####140文字以下
validates :tweet, length: { maximum: 140 }
####1文字以上140文字以下
validates :tweet, length: { in: 1..140 }
####8文字のみ
validates :password, length: { is: 8 }
#数値
####整数のみ
validates :age, numericality: { only_integer: true }
#条件付きバリデーション
####どちらか一方のみ
大喜利のお題などで、文字か写真で一言のような画像のどちらかの場合のみ保存されるようにします。
validate :required_either_image_or_content
private
# image.contentのどちらかの値があればtrue
# image.contentどちらも入力されている場合や入力されていない場合は false
def required_either_image_or_content
return if image.present? ^ content.present?
errors.add(:base, '画像または文字のどちらか一方で投稿可能です')
end
####◯○の場合のみ
支払方法の選択でカードを選択した場合のみに、バリデーションを有効にしたい場合に使います。
validates :card_number, presence: true, if: :paid_with_card?
def paid_with_card?
payment_type == "card"
end
#複数条件にする場合
今まで1つずつ紹介してきましたが、同じカラムに複数の条件を指定したい場合、コードをまとめることができます。
validates :name, presence: true, uniqueness: true, length: { maximum: 13 }
この場合presence: true
を指定しているので、必然的に1文字以上になります。
#まとめ
今回はよく使うバリデーションとして
- 空白
- 一意性(ユニーク)
- 長さ
- 数値
- どちらか一方のみ
- ◯○の場合のみ
を紹介しました。
まだまだバリデーションはたくさんありますので、Railsガイドなどで調べてみてください。