Ruby on Rails 独自のバリデーション 作成方法

Ruby on Rails

Ruby on Rails で 独自のバリデーション を行う方法を紹介します。

はじめに

Railsのバリデーションは、デフォルトのままではカラム単位にしか設定できないので、複雑なものを実現できません。

そこで、

特定の条件下でバリデーションを行いたいとか、デフォルトのバリデーションにないバリデーションを追加して 独自のバリデーション を設定してみましょう。

バリデーション設定

独自のバリデーション

まずは、簡単にデフォルトにない独自のバリデーションを追加してみましょう。

class Post < ActiveRecord::Base
  validate :body_valid?

  private

  def body_valid?
    if body.include?('test')
      errors.add(:body)
    end
  end
end

標準ではvalidatesでバリデーションを追加しますが、それ以外はvalidateでバリデーションを行う関数を指定します。
上記のコードはbodyにtestが含まれないとバリデーションエラーにするというコードになります。

このbody_valid?関数if文を変更することで標準にないバリデーションを表現することが可能です。

ある特定条件下でのバリデーション

次は、ある条件下でバリデーションを実行する方法を紹介します。

class Post < ActiveRecord::Base
  validates :body, presence: true, if: :sub_title_present?

  private

  def sub_title_present?
    sub_title.present?
  end
end

標準のバリデーションの記述の後に、if: :関数名を指定します。
指定した関数がtrueを返せば、validatesが適用されるという動きになっています。

上記のコードは、sub_title_present?sub_titleがあるならbodyも値を入っていないとバリデーションエラーにするコードになっています。

このsub_title_present?関数の中のif文を追加することである条件下でバリデーションを行うことが可能です。

おわりに

最後までご覧いただきありがとうございます!

アプリが複雑になると単純なバリデーションでは済まないようになると思います。

そんな時に、この記事が少しでも役に立てばいいなと思っています!

番外
class Post < ActiveRecord::Base
  validates :body, presence: true, if: :sub_title_present?

  private

  def sub_title_present?
    sub_title.present?
  end
end

このコードはProcを使えば1行のみで表現が可能になります!

そのコードはこちら、

class Post < ActiveRecord::Base
  validates :body, presence: true, if: Proc.new { |post| post.sub_title.present? }
end

Procについては本記事では詳しく説明いたしません。
こちらの記事がわかりやすかと思います。https://www.y-hakopro.com/entry/2019/10/29/213945

追加方でも覚えてもらえればなと、、!

コメント

タイトルとURLをコピーしました