LoginSignup
9
3

More than 1 year has passed since last update.

[Rails]よく使うバリデーションまとめ

Last updated at Posted at 2021-07-18

バリデーション機能は、空で保存してほしくないときや、文字数は10文字以内にしてほしいときなどに、チェックする機能として動きます。

たとえば、インスタグラムのような画像投稿サイトで、画像がないのは望ましくないので、画像は空白では保存できないようにします。
Twiiterのようなテキスト型の投稿サイトなら文字数は140字以内に設定します。

このようにバリデーション機能は、開発者の思うようなアプリ運営を行っていく上で非常に重要な機能です。

Railsではバリデーションをかんたんに実装できるので、今回はよく使うバリデーションの例を実装していきます。

開発環境

ruby 2.6.3
Rails 5.2.6

発動タイミング

バリデーションは、オブジェクトがデータベースに保存される前に発動して、データが正しいかどうかを確認します。

発動するメソッドは以下です

  • create
  • create!
  • save
  • save!
  • update
  • update!

基本形

バリデーションはモデルでカラムを対象に書いていきます。
なのでカラムごとに自由に条件を設定できます。

model
validates :カラム名, 条件

空白

空でないこと

model
validates :body, presence: true

一意性(ユニーク)

他とかぶっていないか、オンリーワンであるか

model
validates :name, uniqueness: true

長さ

1文字以上

model
validates :tweet,  length: { minimum: 1 }

140文字以下

moedl
validates :tweet, length: { maximum: 140 }

1文字以上140文字以下

moedl
validates :tweet, length: { in: 1..140 }

8文字のみ

model
validates :password, length: { is: 8 }

数値

整数のみ

model
validates :age, numericality: { only_integer: true }

条件付きバリデーション

どちらか一方のみ

大喜利のお題などで、文字か写真で一言のような画像のどちらかの場合のみ保存されるようにします。

model
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

◯○の場合のみ

支払方法の選択でカードを選択した場合のみに、バリデーションを有効にしたい場合に使います。

model
validates :card_number, presence: true, if: :paid_with_card?

def paid_with_card?
  payment_type == "card"
end

複数条件にする場合

今まで1つずつ紹介してきましたが、同じカラムに複数の条件を指定したい場合、コードをまとめることができます。

model
validates :name, presence: true, uniqueness: true, length: { maximum: 13 }

この場合presence: trueを指定しているので、必然的に1文字以上になります。

まとめ

今回はよく使うバリデーションとして

  • 空白
  • 一意性(ユニーク)
  • 長さ
  • 数値
  • どちらか一方のみ
  • ◯○の場合のみ

を紹介しました。

まだまだバリデーションはたくさんありますので、Railsガイドなどで調べてみてください。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3