モデルの検証


検証とは

検証(Validation)とは「データの内容が正しいかどうかをチェックする仕組み」です。

そしてRailsの中には検証できる仕組みが用意されていて、それがモデルの検証です。
モデルの検証を利用すれば、自由度の高いチェックを行った上で、ユーザーにエラーをわかりやすく伝えることができます。

モデルの検証の仕組み

Railsにおけるモデルの検証の仕組みは基本的に
「モデルオブジェクト(レコード)をデータベースに登録する前に検証を行い、エラーがあれば登録・更新をしないで差し戻す」
という仕組みになっています。
この登録・更新のためのメソッドとして使われるのがsaveメソッドsave!メソッドです。

saveメソッドsave!メソッドはどちらもデータの登録・更新を行う前に自動的に検証を行い、検証エラーがなければ登録・更新を行ってtrueを返します。しかし、検証エラーが出た場合の処理が異なります。

検証エラーが出た時
saveメソッド  →falseを返す。
save!メソッド →「例外」を発生させる。

検証の書き方

検証コードを書く方法は大きく分けて2つあります。

1.Railsが用意している検証用のヘルパーを利用する。
2.自分で任意の検証コードを用意する。

ここではヘルパーを利用して簡単な例を示します。

models/task.rb
class Task < ApplicationRecord
  #name属性にデータが入っているのか検証
  validates :name, presence: true
end

#name属性が空のtaskオブジェクトを作成
> task = Task.new
> task.save
=> false 
#name属性にデータが入っていないのでfalse

コントローラーで検証エラーに対応する

モデルが検証に引っかかった場合ユーザーに原因をわかりやすく再入力を促す必要があります。
そこでコントローラーでのcreateアクションでは次のように記述します。

controller/tasks_controller.rb
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に代入された入力内容は消えてしまいます。

ビューへの表示

エラーが発生した時に表示される内容をビューに書いていきます。

view/tasks/_form_html.slim
- 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?は検証エラーの有無を調べ、エラーがある時にエラーメッセージを表示するメソッドです。