1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails】 独自 Validation 作成方法(複数モデル適用)

Last updated at Posted at 2020-01-25

はじめに

バリデーションの作成方法はモデル内にprivateメソッドを作って、そのメソッドをvalidateの引数に指定する方法が一般的かと思います。
今回は、複数のモデルで同じバリデーションを適用したいケースへの対応方法をまとめました。

独自バリデーション作成方法

やること

開始日時カラムと終了日時カラムを持ったモデルの入力フォームに、
どちらのカラムも入力するか、どちらのカラムも入力しないバリデーションをかけたい。

Concern

まずは、app/models/concernsの直下にバリデーション専用のクラスを作成する。
Concernsを使用することで、同じカラムを持った他のモデルにも適用することができ、さらに細かい継承関係を考えなくてもよくなります。

app/models/concerns/work_datetime_validation.rb
class WorkDatetimeValidation < ActiveModel::Validator
  # record には、インスタンスが入る
  def validate(record)
    return if record.work_datetime_begin && record.work_datetime_end
    return if !record.work_datetime_begin && !record.work_datetime_end
    record.errors[:base] << '開始日時と終了日時どちらも入力するか、どちらも空にしてください'
  end
end

Model

次にModelにvalidates_withを用いて、先ほど作成したクラスを指定する。

他のModelにも適用させたい場合は、validates_withを他のクラスに書けばバリデーションが適用されます。

app/models/work.rb
class Work < ApplicationRecord
  validates_with WorkDatetimeValidation
end

以上となります。

まとめ

時間に関するバリデーションは複数のモデルで使用したいというニーズがあると思いますので、ぜひ活用してみてください。


会社紹介

株式会社 Mosaica
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。

詳しくは 公式サイト までお気軽にご相談ください。
公式サイト: https://mosaica.co.jp/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?