はじめに
今回はRailsのActiveRecordのバリデーションについて簡単にまとめます。
基本的なバリデーション
ある属性に必ず値が入っていること、何文字以内であることなど、一つの属性に対するバリデーションは下記のように行えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | classUser<ActiveRecord # 名前がnullでなく15文字以内であること validates:name,presence:true,length:{maximum:15} # 会員IDがnullでなく10文字以内でユニークであること validates:user_code,presence:true,length:{is:10},uniqueness:true # 年齢が10歳以上20歳未満であること validates:age,presence:true, numericality:{ greater_than_or_equal_to:10, less_than:20 } # 性別がnullでないこと validates:gender,presence:true end |
EachValidatorクラス
EachValidatorクラスを継承したクラスを定義すると、一つの属性に対して新しい検証ルールを追加することができます。
1 2 3 4 5 6 7 | classEmailValidator<ActiveModel::EachValidator # EachValidatorではvalidate_eachというメソッドを定義する必要が有る defvalidate_each(record,attribute,value) # errorsに値を入れることでバリデーション失敗としている record.errors.addattribute,'error message'ifvalue.end_with?('@hoge.com') end end |
バリデータの適用は下記のとおりです。
1 2 3 4 5 6 7 8 9 10 | classUser<ActiveRecord # ActiveRecord::baseを継承していない場合は、下記のモジュールをincludeする # include ActiveModel::Validations # 中略… # 引数として渡された(この場合はemail:)ハッシュのキーに応じたEachValidatorが利用される # この場合はEmailValidatorが利用される validates:email,presence:true,email:true end |
Validatorクラス
Validatorクラスを継承したクラスを定義すると、複数の属性が絡むような複雑な検証ルールを定義できます。
1 2 3 4 5 6 7 8 9 10 11 | classMemberRegistrationValidator<ActiveModel::Validator # validateメソッドを定義する必要がある defvalidate(record) # enum gender: { male: 1, female: 2 } ifrecord.age<20andrecord.male? record.errors.add:base,'error message1' elsifrecord.age<18andrecord.female? record.errors.add:base,'error message2' end end end |
バリデータの適用は下記のとおりです。
1 2 3 4 | classUser<ActiveRecord # 省略… validate_withMemberRegistrationValidator end |
autoload_pathsの編集
今回はバリデータクラスをlib/validator/以下のディレクトリに配置しました。
このディレクトリはそのままでは読み込まれないので、config/application.rbを修正します。
1 2 3 4 5 6 | moduleTestApp classApplication<Rails::Application # カスタムバリデータ用ディレクトリ config.autoload_paths+=%W(#{config.root}/lib/validators) end end |
さいごに
RailsのActiveRcoredのバリデーションについて紹介しました。