カテゴリー: BackEnd

Railsのバリデーション

はじめに

今回はRailsのActiveRecordのバリデーションについて簡単にまとめます。

基本的なバリデーション

ある属性に必ず値が入っていること、何文字以内であることなど、一つの属性に対するバリデーションは下記のように行えます。

class User < 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クラスを継承したクラスを定義すると、一つの属性に対して新しい検証ルールを追加することができます。

class EmailValidator < ActiveModel::EachValidator
  # EachValidatorではvalidate_eachというメソッドを定義する必要が有る
  def validate_each(record, attribute, value)
    # errorsに値を入れることでバリデーション失敗としている
    record.errors.add attribute, 'error message' if value.end_with?('@hoge.com')
  end
end

バリデータの適用は下記のとおりです。
 

class User < ActiveRecord
  # ActiveRecord::baseを継承していない場合は、下記のモジュールをincludeする
  # include ActiveModel::Validations

  # 中略…

  # 引数として渡された(この場合はemail:)ハッシュのキーに応じたEachValidatorが利用される
  # この場合はEmailValidatorが利用される
  validates :email, presence: true, email: true
end

 

Validatorクラス

Validatorクラスを継承したクラスを定義すると、複数の属性が絡むような複雑な検証ルールを定義できます。

class MemberRegistrationValidator < ActiveModel::Validator
  # validateメソッドを定義する必要がある
  def validate(record)
    # enum gender: { male: 1, female: 2 }
    if record.age < 20 and record.male?
      record.errors.add :base, 'error message1'
    elsif record.age < 18 and record.female?
      record.errors.add :base, 'error message2'
    end
  end
end

バリデータの適用は下記のとおりです。
 

class User < ActiveRecord
  # 省略…
  validate_with MemberRegistrationValidator
end

 

autoload_pathsの編集

今回はバリデータクラスをlib/validator/以下のディレクトリに配置しました。
このディレクトリはそのままでは読み込まれないので、config/application.rbを修正します。

module TestApp
  class Application < Rails::Application
    # カスタムバリデータ用ディレクトリ
    config.autoload_paths += %W(#{config.root}/lib/validators)
  end
end

 

さいごに

RailsのActiveRcoredのバリデーションについて紹介しました。

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: Rails

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前