Rails – バリデーション

概要

Railsでモデルを介してフォーム入力を扱う場合、入力データが適正かどうか条件を設定して検証できる。

検証の条件はvalidatesをモデルクラス内で定義し、savevalid?などのメソッド実行に際して検証が行われる。これらのメソッドは検証結果の適正/不適正によってtrue/falseの戻り値を持つので、その結果に応じてflashによるエラー表示などの処理を行うことができる。

バリデーションの記述

モデルクラスの定義で以下を記述。

validates:(:対象カラム , 検証内容1, 検証内容2, ...) 

たとえばUserモデルのnameの存在と長さを検証する場合は以下のように書く。

app/models/user.rb

バリデーションの確認

通常、モデル内にvalidatesを書くと、モデルのsave実行前に検証が行われる。

モデルインスタンスのvalid?を実行すると、その時点でモデルの内容が妥当かどうかが検証され、検証結果が妥当であればtrue、妥当でなければfalseが返される。

また、妥当でない場合のエラーの内容は、モデルのerrors.messagesで確認できる。

app/controllers/users_controller.rb

たとえば検証結果が妥当な場合のRailsサーバーのログは、

何も入力しなかった場合は、

長さが制限を超えた場合は、

バリデーションの種類

presence~存在確認

<書式>

presence: true

入力内容がnil、空文字列、スペースでないことを検証する。全角スペースも検証の対象となる。内部でblank?メソッドを使っている。

<実行例>

モデル

errors.messages

逆にnil、空文字列、スペースのみであることを検証する場合はabscenceを使う。

length~長さの検証

<書式>

length: { 制限オプション: 制限値 }

長さを検証する。制限オプションと制限値のパターンは以下の通り。

  • :minimum:長さの最小値
    • 例:{ minimum: 10 }
  • :maximum:長さの最大値
    • 例:{ maximum: 20 }
  • :is:長さがこの値に一致しなければならない
    • 例:{ is: 10 }
  • :in/:witnin:長さの範囲
    • 例:{ in: 10..20 }

<実行例>

モデル

errors.messages

numericality~数値の検証

<書式>

numericality: true

numericality: { 制限オプション: 制限値 }

入力内容が数値形式であることを検証する。デフォルトでは整数・実数にマッチするが、制限オプションでいろいろなパターンを検証できる。

  • :only_integer:整数
  • :even/:odd:偶数/奇数
  • :equal_to:与えた数に等しい
  • :other_than:与えた数以外
  • :greater_than:与えた数より大きい
  • :greater_than_or_equal_to:与えた数より大きい
  • :less_than:与えた数より大きい
  • :less_than_or_equal_to:与えた数より大きい

<実行例>

errors.messages

format~パターンマッチング

<書式>

format: { with: 正規表現 }

入力のパターンが正規表現にマッチするかどうか検証する。正規表現を定数に設定しておく書き方が使われる。

<実行例>

モデル

errors.messages

検証結果のメッセージ

メッセージの構造

検証結果のエラーが1つの場合の、バリデーションのメッセージを確認する。

入力値とメッセージの内容は以下の通り。

 

この出力は以下のコードで表示させている。出力結果から、errors.messagesの内容は以下のようであることがわかる。

  • errors.messagesはハッシュ
  • ハッシュの キーはモデル名
  • ハッシュの値は配列で、配列の要素はメッセージ文

これを踏まえて、以下のコードの10行目のように取り出している。

複数の検証を設定した場合

1つの要素に複数の検証を設定し、それらがエラーになった場合を考える。

errors.messagesがハッシュなので、eachでキーと値を取り出し、その値が配列なのでeachで各メッセージを取り出す。

表示結果は以下の通り。

message:~メッセージの定義

メッセージは英語の文字列だが、message:で検証項目ごとのメッセージを定義できる。たとえば上の例で長さとパターンのそれぞれにメッセージを追加した例。

実行結果は以下の通り。

presenceuniquenessの場合は以下のように定義する。

presence: { message: "未入力の場合のメッセージ" }

uniqueness: { message: "重複したの場合のメッセージ" }

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です