3. バリデーション(3)
2012/09/24 シナジーマーケティング(株) 寺岡 佑起
Model 3章 バリデーション
3.1. バリデーションとは
3.2. バリデーションの定義
3.3. バリデーションの実行タイミング
3.4. バリデーションエラーの確認
3.5. ビューへの表示
3.6. 組み込みのバリデーション
3.7. 共通のバリデーションオプション
3.8. 独自ロジックでのバリデーション
3.9. カスタムバリデータの作成
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