#検証とは
検証(Validation)とは**「データの内容が正しいかどうかをチェックする仕組み」**です。
そしてRailsの中には検証できる仕組みが用意されていて、それがモデルの検証です。
モデルの検証を利用すれば、自由度の高いチェックを行った上で、ユーザーにエラーをわかりやすく伝えることができます。
#モデルの検証の仕組み
Railsにおけるモデルの検証の仕組みは基本的に
「モデルオブジェクト(レコード)をデータベースに登録する前に検証を行い、エラーがあれば登録・更新をしないで差し戻す」
という仕組みになっています。
この登録・更新のためのメソッドとして使われるのがsaveメソッド
とsave!メソッド
です。
saveメソッド
とsave!メソッド
はどちらもデータの登録・更新を行う前に自動的に検証を行い、検証エラーがなければ登録・更新を行ってtrueを返します。しかし、検証エラーが出た場合の処理が異なります。
検証エラーが出た時
saveメソッド
→falseを返す。
save!メソッド
→「例外」を発生させる。
#検証の書き方
検証コードを書く方法は大きく分けて2つあります。
1.Railsが用意している検証用のヘルパーを利用する。
2.自分で任意の検証コードを用意する。
ここではヘルパーを利用して簡単な例を示します。
class Task < ApplicationRecord
#name属性にデータが入っているのか検証
validates :name, presence: true
end
#name属性が空のtaskオブジェクトを作成
> task = Task.new
> task.save
=> false
#name属性にデータが入っていないのでfalse
#コントローラーで検証エラーに対応する
モデルが検証に引っかかった場合ユーザーに原因をわかりやすく再入力を促す必要があります。
そこでコントローラーでのcreateアクションでは次のように記述します。
def create
@task = Task.new(task_params)
if @task.save
redirect_to @task, notice: "タスクを登録しました"
else
render :new
end
end
ここではsaveメソッド
を利用しています。これは返り値のtrueまたはfalseを使って条件分岐させているからです。
save!メソッド
ではエラーが発生した時、falseではなく、「例外」が発生してしまうので条件分岐には利用できません。
また、ここではローカル変数のtaskではなく、インスタンス変数の@taskにオブジェクトを代入しています。
これは検証を行った現物のオブジェクトを@taskに保持させれば、フォームの内容を引き継いで表示できるからです。これによってエラーが発生しても、エラー発生前の内容が表示され、それを修正することが可能になります。
もし、@taskではなくtaskにオブジェクトを代入してエラーが起きた場合は、ローカル変数はメソッド内でしか保持されないので、他の画面に遷移した時点でtaskに代入された入力内容は消えてしまいます。
#ビューへの表示
エラーが発生した時に表示される内容をビューに書いていきます。
- if task.errors.present?
ul#error_explanation
- task.errors.full_messages.each do |message|
li = message
#以下フォーム欄の記述
= form_with model: task, local: true do |f|
…
errors.present?は検証エラーの有無を調べ、エラーがある時にエラーメッセージを表示するメソッドです。