Rails5 バリデーションの書き方
バージョン
Rails 5.1.4
対象
下図のようなお問い合わせフォームのバリデーションを作成していく。
文法
validates シンボル1,シンボル2, シンボル3,・・・, バリデーションの種類: {オプション: true}
※カラムのシンボル名は→「:」+「カラム名」
※「バリデーションの種類:」の後スペースが必要。presence:trueのようにスペースがないと:trueをシンボルだと認識してしまう。
バリデーションの種類やそのオプションはガイドを参考に
※ガイドに書いてある「%{value}」はコントローラーから送られてくる変数ではなく、バリデーションの種類とそのオプションに応じて使える変数である。too_longの%{count}も同じ
こんな感じ・・・
2行目は名前の欄に記入された文字へのバリデーション。
presence: は空欄の場合、エラーを発生させるバリデーションの種類。
length: は文字数設定。
maximum: や too_long: はlengthのオプション。
8行目の
format: は設定したパターンと同じでないときエラーを返すもの
message: はformatのオプション。エラーが発生したときに
「・(カラム名) (メッサージ)」の形でエラー文を表示
formatだけでなく色んなバリデーションへつけられる。
エラー結果↓↓↓
ただ、上記だけでは上のようにモデルの属性値は日本語になりません。
モデルの属性値の日本語化はこちらにまとめました↓↓↓
フレキシブルなメソッドでの書き方
メソッドであればより柔軟にバリデーションを設定できる。下のコードは上のコードとほぼ同じ結果になる。メソッドを使うことで日本語翻訳設定をしなくても日本語でエラー文を表示できる。
メソッドにするときは「validates」ではなく「validate」と単数形で「:メソッド名」
引数の渡し方は不明。
とりあえず「validate :メソッド」にすればバリデーションするためのパラメーターが渡される。
name, email, contentのようにカラム名を引数のような形で扱う。
バリデーションを書いているときに・・・
バリデーションのコードを書いていて試したいときにはrails cが使える。
rails cで仮にエラーが出るように登録してみる
・変数.vaild? →検証できてるかどうか
・変数.errors.full_messages →エラー内容が確認できる
・変数.errors →エラー発生時どんな内容のエラーか確認できる。
・変数.errors.count →エラーの数
・変数.errors.full_messages →エラーのメッセージ。
また、複数のターミナルを開いて、このターミナルではサーバーを起動。こちらのターミナルではrails cを起動。などにしておくと、いちいちサーバーを落としたりしなくてもいい。