はじめに
ActiveRecord(モデル)のバリデーション設定を行うことで、実際にデータが保存される前に不適合データを弾くことができます。ほとんどのデータベースはカラムに制約を設定することができますが、Railsアプリのモデルでバリデーションを行えば、Railsアプリとデータベース間の無駄なやり取りを減らすことができます。また、テストやメンテナンスのしやすさもメリットのひとつです。
本記事では、ActiveRecord(モデル)のバリデーションについてまとめています。
バリデーションの使い方
バリデーションの動作
バリデーションはコントローラーでデータを保存、作成、更新しようとしたときに実行されます。バリデーションチェックの結果が不適合だった場合、save
、update
はfalse
を返し、create
はインスタンスの中身をそのまま返します。また、末尾に!
(エクスクラメーションマーク)が付いているメソッドはActiveRecord::RecordInvalid
例外が発生します。
メソッド | 説明 |
---|---|
save /save! |
new で作成したインスタンス、値を更新したインスタンスを保存する。 |
create /create! |
モデルのインスタンスを作成し保存する。 |
update /update! |
モデルのインスタンスを更新し保存する。 |
バリデーションチェックの結果が不適合だった場合、インスタンスのerrors
ハッシュにエラー内容が格納されます。
# ユーザーモデル
validates :name, presence: true
validates :age, presence: true
# ユーザーコントローラー
user = User.new(name: 'Jane')
user.save
user.errors.messages
# => {:age=>["can't be blank"]}
エラー内容をビューに表示する時はerrors.full_messages
を使います。フォームのエラー表示については以下の記事を参照してください。
バリデーションの種類
モデルにはたくさんのバリデーションが用意されています。ここでは、よく使うであろうバリデーションのみを紹介します。
presence
presence
は指定された属性に値が入力されているかを確認します。入力された値がnil
、空欄、ホワイトスペース(""
)の場合、不適合となります。
validates :name, presence: true
length
length
は指定した長さと合致しているかを確認します。指定した長さに合致しなければ不適合となります。
validates :name, length: { minimum: 1 }
validates :content, length: { maximum: 300 }
validates :password, length: { in: 8..32 }
validates :cell_phone_number, length: { is: 11 }
format
format
はwith
オプションで指定した正規表現に合致しているかを確認します。入力された値が正規表現に合致しなければ不適合となります。
validates :content, format: { with: /[ぁ-んァ-ヶ一-龥]+?/ }
正規表現の内容が「数字のみ」の場合、numericality
を使うこともできます。デフォルトでは整数または浮動小数点の数字を許可します。整数のみを許可したい場合はonly_integer
を有効にします。
validates :age, numericality: { only_integer: true }
# 以下と同じバリデーション
# validates :age, format: { with: /\A[+-]?\d+\z/ }
confirmation
confirmation
は2つのテキストフィールドが完全に一致しているかを確認します。メールアドレスやパスワードの確認などで2つが一致していなければ不適合となります。このバリデーションを指定した属性に_confirmation
を付け足した確認用の属性が自動で作成されます。
確認用の属性がnil
の場合はこのバリデーションが行われないため、確認用の属性には必ずpresence
を指定しておきます。
validates :password, confirmation: true
validates :password_confirmation, presence: true
acceptance
acceptance
はフォームのチェックボックスがオンかを確認します。「利用規約に同意する」などのチェックボックスがオンになっていなければ不適合となります。このバリデーションを指定する属性は画面上でしか使われないため(データベースに保存する必要がないため)、テーブルに対応するカラムが存在する必要はありません。
validates :accept, acceptance: true
独自のエラーメッセージ
バリデーションチェックの結果が不適合だった場合にerrors
ハッシュに格納される独自のエラーメッセージを定義できます。
validates :content, presence: true, format: { with: /[ぁ-んァ-ヶ一-龥]+?/, \
message: 'には日本語を含めてください Content must contain Japanese.' }
まとめ
最近のモダンブラウザはフォームに入力した値が送信される前に簡単なフォーマットチェック(メールアドレスなど)を行ってくれます。ですが、やはりそれだけでは不十分なことも多いので、Railsアプリでバリデーションを設定しておく必要があります。
本記事を参考にして、ActiveRecord(モデル)のバリデーションについて覚えていただければと思います。