LoginSignup
0
0

More than 3 years have passed since last update.

検証とは

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0