railsのvalidatesの方法・使い方について解説

rails

本記事では、railsのバリデーションで使用するvalidatesについて解説していきます。

バリデーションとは?

バリデーションとは、テーブルに予期しない値が入らないようにする機能です。

例えば、このカラムにはnullが入らないようにするとか、一意のデータに制限する(すでに同じaddressがデータベースに存在する場合は登録できないようにする)などができるようになります。

バリデーションを行うことで、データベースに登録(編集)した際に、バリデーションに弾かれた場合はエラーを返し、予期せぬ値を登録するのを防ぎます。

バリデーションを行うことで、アプリのバグを減らすことができ、開発していく上での重要な技術のため、ぜひこの機会に習得していただければと思います。

railsのバリデーションの方法について

railsでは、バリデーションはapp/models配下のファイルで行うことができ、validatesメソッドを使用します。

下記がvalidationの一例になります。Userモデルがあり、nameというカラムを持つテーブルがあるとします。

class User < ApplicationRecord
  validates :name, presence: true # nameカラムを空白で登録しないようにバリデーション
end

上記のように指定することで、Userモデルを登録する際に空白となってしまうことを防ぎます。

railsではvalidatesの後にカラム名を指定して、その後のオプションにバリデートしたい内容を書くことでバリデーションを行うことができます。

validateのヘルパーメソッドまとめ

railsのvalidatesのヘルパーメソッドを使用してできることを以下にまとめました!(チートシートとしてご活用ください)

このサイトでは自分が使ったことがある物だったり、使われそうな物をまとめています。全てを知りたい場合は公式ドキュメントを参照してみてください!

値が入っているかを検証する(presence:true)

値が入ってない(emptyのとき)場合エラーを返す

  validates :name, presence: true

文字の長さを検証する(length)

文字数が指定した条件範囲内であることを検証する。下記を満たさない場合エラーを返す。

validates :name, length: { maximum:20 } # 最大20文字
validates :name, length: { minimum:20 } # 最低でも20文字
validates :name, length: { in: 5..20 } # 5〜20文字

数値や日時が指定した範囲にあることを検証する(comparison)

数値で値が指定した範囲にある場合のみ登録できるようにする。

validates :age, comparison: { greater_than: 20 } # ageは20より大きい値でないといけない
validates :age, comparison: { less_than: 20 } # ageは20より小さい値でないといけない
validates :age, comparison: { other_than: 20 }# ageは20以外の値でないといけない

同じ値がデータベースに存在しないかを検証する(uniqueness)

値が一意であることを検証し、すでに同じ値がDBに登録されている場合は、エラーを返す。

validates :email, uniqueness: true #すでにemailが登録されていたら登録できない

数値に対してバリデーションをかける(奇数・偶数・大小評価)(numericality)

属性に数値のみが使われているかを確認する。

validates :age, numericality: true # 数値以外のデータが存在したら登録できない

奇数、偶数の判定も可能。

validates :odd_data, numericality: { odd: true } # odd_dataは奇数でなければならない
validates :even_data, numericality: { even: true } # odd_dataは偶数でなければならない

指定した値が含まれているかどうか検証する(inclusion)

指定した値のみしか受け付けないようにするバリデーション

STATUS = ['male', 'female']
validates :sex, inclusion: { in:STATUS } #sexはmaleかfemaleのみしか受け付けません。

指定した値が含まれていないかを検証する(exclusion)

inclusionと逆で指定した値は受け付けないようにするバリデーション

STATUS = [ self ]
validates :send_to, exclusion: { in:STATUS } #send_toはselfに指定できません

正規表現(英語・日本語等)でバリデーションをかける(format)

正規表現でバリデーションをかける。

validates :name, format: { with: /\A[a-zA-Z]+\z/} # nameはアルファベットのみで構成される
validates :email, format: { with: /\A[a-zA-Z0-9]+\z/ } # emailは数値とアルファベットで構成される

validationを応用した手法

バリデーションが有効かを判断する(valid?、invalide?)

バリデーションが有効かどうかで条件分岐を実行することができる。

例えば、下記のバリデーションを設定していたとする。

validates :name, length: { in: 5..20 } 

無効な値がnewで作成されようとした場合、おかしい値だった場合に処理を実行することができる

person = Person.new(name: 'a')
if person.valid?
 ...
else
 # バリデーションエラーのため、elseの処理が実行される

独自のバリデーションを作成する

自身で定義したvalidationを適用することができる。

class User < ApplicationRecord
  validate :custom_validator
  
  def custom_validator
    errors.add(:name, 'に.を入れないでください!') if name&.include?('.')
  end
end

エラーメッセージをカスタマイズする

messageオプションを使用することで、独自のエラーメッセージを使用することができる。

class User < ApplicationRecord
validates :name, presence: { message: "値がないよ!" }
# エラー発生時、user.errors.messages.nameで"値がないよ!"が取得できる。

railsのvalidation記法まとめ

本記事では、railsでのvalidationの記法について紹介しました。

実装していく上でためになるvalidation記法があればどんどん追記していきます!

コメント

タイトルとURLをコピーしました