楽しいだけで十分です

Ruby on Rails 5アプリケーションプログラミング CHAPTER5-5 (検証機能の実装)

Ruby on Rails 5アプリケーションプログラミング | Gihyo Digital Publishing … 技術評論社の電子書籍の読書メモです。Modelのvalidation関連のお話。


検証の指定の用語

名前 意味 e.g.
field 検証対象のフィールド(DBのカラムなど)。複数指定が可能 `:email`, `:price`
name 検証名 `presence`, `length`
params 検証パラメーター。指定方法は`{パラメーター名: 値}`のハッシュ、または`true`。複数指定が可能 `{minimum: 1, maximum: 100}`, `true`

acceptance検証

  • 同意を求めるチェックボックスにチェックが入っていない場合にエラーにしたい時に利用する
  • DBに対応するフィールドを用意する必要がない

空白時にvalidateをスキップする

  • 1つのフィールドに対して複数の検証項目がある場合に、空白なら検証したくない場合に利用する

    • e.g. 入力必須と形式指定の検証がある場合で、ユーザーの入力が空白である場合に両方のエラーを出してしまうとユーザーが混乱するかもしれない。その際に1つずつエラーを出したいなどの用途で使う

allow_nilパラメーター

  • nilの場合にvalidateをスキップする

allow_blankパラメーター

  • nilと空文字列の場合ににvalidateをスキップする

onパラメーター

  • 検証のタイミングを制限する
  • 以下の設定ができる
タイミング 概要
create 新規登録時のみ
update 更新時のみ
save 新規登録/更新時の両方(デフォルト)

条件付きの検証

  • if, unlessパラメーターを使う
  • 条件の記述方法は、次の2つがある

    • シンボル(定義したメソッド)による指定
    • Procオブジェクトによる指定

条件を満たした場合に複数の検証する

  • with_optionsメソッドを使う

自作検証クラスの作成

  • 標準のvalidate機能ではまかなえない、かつ複数のモデルで利用する検証の場合に利用する
  • /app/modelsの配下に作成する (決まっている訳ではない...?)

パラメーターを持たない検証クラス

  • 命名は、 検証名Validator
  • ActiveModel::EachValidatorクラスを継承する
  • 検証を行うメソッドは、validate_eachメソッド。引数には次の3つを取る

    • 検証対象のモデルオブジェクト (record)
    • 検証対象のフィールド名 (attribute)
    • 検証対象の値 (value)
  • 検証によって発生したエラーは、errors.addメソッドを使って、モデルオブジェクトに登録する必要がある (つまり、record.errors.add(エラー内容) と記述する)
  • モデルで利用する方法

    • nameは、検証クラス名からValidatorを除いて、アンダースコアケースにしたもの
    • paramsは、パラメーターを持たないのでtrue

パラメーターを持つ検証クラス

  • パラメーターにはoptions[パラメーター名]でアクセスする (e.g. options[:allow_old])
  • モデルで利用する方法

    • paramsは、{ パラメーター名: 値 }にする
  • 他は、パラメーターを持たない検証クラスと同じ

指定したフィールドの値を取得

  • attributes[フィールド名]メソッドを使う (e.g. record.attributes[options[:compare_to]].to_i)

検証クラスを使わないカスタム検証

  • 特定のモデル固有のvalidateであるため、わざわざ自作検証クラスを定義するほどではない時に利用する
  • 実装方法は以下のもの

    • モデル内でプライベートメソッドとして検証ルールを定義する (基本は自作検証クラスと同じだが、モデル配下なので、recordを介さないでもerrors.addメソッドなどにアクセスできる)
    • 検証メソッドを呼び出すために、validateメソッドを使う (e.g. validate :isbn_valid?)

DBに関連しないモデル定義

  • DBのフィールドではないが、フォームからの入力をvalidateしたい場合などに使う

Active Modelとは

  • モデルの基本的な構造や規約を決定するコンポーネント
  • Active Modelの機能(ActiveModel::Modelモジュール)を利用することで、DBと対応関係のないモデルを実装することもできる

実装方法

  • ActiveModel::Modelモジュールをincludeする
  • モデルとして管理する項目をアクセサ(attr_accessorメソッド)で定義
  • validatesなどで検証ルールを定義
  • あとは、コントローラーで利用する
yinm

WRITTEN BY yinm

I'm a software engineer.