if it does't challenge you, it can't change you

RubyのWebエンジニアやってます。主にRuby on Railsのことで勉強になったこと書いていきます。

Rails5 バリデーションの書き方

バージョン

Rails 5.1.4

 

対象

下図のようなお問い合わせフォームのバリデーションを作成していく。

f:id:shoheimoment:20171014161429p:plain

 

文法

 

validates シンボル1,シンボル2, シンボル3,・・・, バリデーションの種類: {オプション: true} 


※カラムのシンボル名は→「:」+「カラム名
※「バリデーションの種類:」の後スペースが必要。presence:trueのようにスペースがないと:trueをシンボルだと認識してしまう。

バリデーションの種類やそのオプションはガイドを参考に

 ※ガイドに書いてある「%{value}」はコントローラーから送られてくる変数ではなく、バリデーションの種類とそのオプションに応じて使える変数である。too_longの%{count}も同じ

 

こんな感じ・・・

Rails5でバリデーション

 2行目は名前の欄に記入された文字へのバリデーション。
presence: は空欄の場合、エラーを発生させるバリデーションの種類。
length: は文字数設定。
maximum: や too_long: はlengthのオプション。
8行目の
format: は設定したパターンと同じでないときエラーを返すもの
message: はformatのオプション。エラーが発生したときに
「・(カラム名)  (メッサージ)」の形でエラー文を表示
formatだけでなく色んなバリデーションへつけられる。

エラー結果↓↓↓

f:id:shoheimoment:20171015200312p:plain

 

ただ、上記だけでは上のようにモデルの属性値は日本語になりません。

モデルの属性値の日本語化はこちらにまとめました↓↓↓

shoohei.hatenablog.com

 

 フレキシブルなメソッドでの書き方

メソッドであればより柔軟にバリデーションを設定できる。下のコードは上のコードとほぼ同じ結果になる。メソッドを使うことで日本語翻訳設定をしなくても日本語でエラー文を表示できる。

Rails5 バリデーション メソッド形式


メソッドにするときは「validates」ではなく「validate」と単数形で「:メソッド名」
引数の渡し方は不明。
とりあえず「validate :メソッド」にすればバリデーションするためのパラメーターが渡される。
name, email, contentのようにカラム名を引数のような形で扱う。

 

バリデーションを書いているときに・・・

バリデーションのコードを書いていて試したいときにはrails cが使える。
rails cで仮にエラーが出るように登録してみる

f:id:shoheimoment:20171014164838p:plain


・変数.vaild? →検証できてるかどうか

f:id:shoheimoment:20171014164900p:plain

 

・変数.errors.full_messages →エラー内容が確認できる

f:id:shoheimoment:20171014164928p:plain

 

・変数.errors →エラー発生時どんな内容のエラーか確認できる。

f:id:shoheimoment:20171014164946p:plain

 

・変数.errors.count →エラーの数

f:id:shoheimoment:20171014165000p:plain

 

・変数.errors.full_messages →エラーのメッセージ。

f:id:shoheimoment:20171014165016p:plain

 

また、複数のターミナルを開いて、このターミナルではサーバーを起動。こちらのターミナルではrails cを起動。などにしておくと、いちいちサーバーを落としたりしなくてもいい。