目次へ

3. バリデーション(3)

2012/09/24 シナジーマーケティング(株) 寺岡 佑起

3.6. 組み込みのバリデーション

Active Recordには文字数制限や数値文字の検証など、多くのシステムで必要とされるバリデーションがあらかじめ組み込まれています。
組み込みで利用できるバリデーションを紹介します。

presence

入力が必須であるフィールドに対して指定します。
bool型のフィールドを検証する場合は、後述のinclusionに[true, false]の配列を指定するようにしてください。
bool型にpresenceを指定しても、false.blank? が true を返すため期待通りには動作しません。

  class Employee < ActiveRecord::Base
    validates :name, :presence => true
  end

numericality

数値入力が必要であるフィールドに対して指定します。

  class Employee < ActiveRecord::Base
    validates :employee_number, :numericality => true
  end

numericalityバリデーションはデフォルトでは小数値の入力も許容します。
整数のみとしたい場合は、only_integerオプションを指定します。

  class Employee < ActiveRecord::Base
    validates :employee_number, :numericality => {:only_integer => true}
  end

また、入力可能な数値の範囲も指定可能です。
以下のオプションを組み合わせて指定することができます。

オプション 説明
greater_than 指定された値を超える数値を許容する
greater_than_or_equal_to 指定された値以上の数値を許容する
equal_to 指定された値の数値を許容する
less_than 指定された値未満の数値を許容する
less_than_or_equal_to 指定された値以下の数値を許容する

length

指定した範囲の文字数での入力が必要であるフィールドに対して指定します。
範囲を指定する場合はRangeクラスのインスタンスで指定します。

  class Employee < ActiveRecord::Base
    validates :name, :length => (10..25)
  end

範囲以外で指定したい場合、以下のオプション指定を利用できます。

オプション 説明
minumum 指定された文字数以上の文字を許容する
maximum 指定された文字数以下の文字を許容する
is 指定された文字数の文字を許容する
within Rangeクラスのインスタンスで指定された範囲の文字数を許容する
in withinと同様

inclusion

指定した範囲内での入力が必要であるフィールドに対して指定します。
配列、Rangeなど、include?メソッドを持つインスタンスを指定します。

  class Employee < ActiveRecord::Base
    validates :gender, :inclusion => ['male', 'female']
  end

exclusion

inclusionの逆で、指定した範囲の入力を拒否したいフィールドに対して指定します。
配列、Rangeなど、include?メソッドを持つインスタンスを指定します。

  class Person < ActiveRecord::Base
    validates :username, :exclusion => ['admin', 'superuser']
  end

format

指定されたフォーマットでの入力が必要であるフィールドに対して指定します。
フォーマットは正規表現で指定することができます。

  class Person < ActiveRecord::Base
    validates :email, :format => /\A[0-9a-zA-Z]+\z/
  end

acceptance

指定した値が入力されている必要があるフィールドに対して指定します。
「規約に同意する」のような、チェックボックスにチェックがないと入力エラーにしたい場合などに利用されます。

  class Person < ActiveRecord::Base
    validates :accepted, :acceptance => true
  end

confirmation

2つの入力フィールドが等しい必要があるフィールドに対して指定します。
パスワードやメールアドレスの再入力などに利用されます。
確認用にはフィールド名の末尾に「_confirmation」を追加したものが利用されます。

  class Person < ActiveRecord::Base
    attr_accessor :password_confirmation
    validates :password, :confirmation => true
  end

uniqueness

対象のフィールドがデータベース内で一意である必要があるフィールドに対して指定します。
ロック処理などは行われないため、トランザクションが重なると重複データが作成される可能性があることに注意してください。
厳密に一意性を保ちたい場合は、データベースのユニーク制約・レコードロック・lock_versionカラムによる楽観的ロックなどを利用する必要があります。

対象のフィールドが文字列型の場合、case_sensitiveオプションにfalseを指定することで、大文字小文字の差を無視するすることが可能です。
また、scopeオプションにフィールド名を指定すると、指定されたフィールドの値が同一であるレコード中で一意になるように検証されます。

  class Person < ActiveRecord::Base
    validates :user_no, :uniqueness => {:case_sensitive => false, :scope => :account_id}
  end

associated

対象のモデルの関連モデルに対しても同時に検証を行いたい場合に指定します。
バリデーション実行時に、has_one、has_many、belongs_toなどの関連モデルに対するバリデーションが実行されます。
対象のモデルのバリデーションに失敗した場合、errorsには:invalidエラーが格納されます。
対象モデルに発生した個々のエラー情報は、対象のモデルのerrorsに格納されます。
注意点として、associatedバリデーションを関連元と関連先のモデルの両側に定義してはいけません。
バリデーション呼び出しが循環し、無限ループを起こしてしまいます。
※モデル間の関連(Association)については以降の章で詳しく説明します。

  class Order < ActiveRecord::Base
    has_manu :items
    belongs_to :customer
    validates :items, :associated => true
    validates :customer, :associated => true
  end

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp