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
追加方でも覚えてもらえればなと、、!
コメント