railsで条件つきvalidationをする方法

A, B, Cがあり、Aをしたら、B,Cがvalidationを行うという状況をしたかったです。

こんなことってありませんか?

あまりないのかもしれない・・・

やり方

with_optionsを使えば特定の条件下で複数のvalidationをかけることができます。

個別で行いたい場合は、if: ~とvalidatesの後に書くことでできます。

参考

Active Record バリデーション | Rails ガイド

今回はバナーの位置を表示したく、位置情報が選択されたらバナーの情報をvalidationをかけたかったのです。

enumを使っていますが、下記のようになります。

Banner < ActiveRecord::Base
  enum position: %w(nothing top bottom both)

  with_options unless: :nothing? do
    validates :url, presence: true, format: /\A#{URI::regexp(%w(http https))}\z/
    validates :title, presence: true, length: { maximum: 100 }
  end
end

positionの値がnothingでなければ、二つのvalidationをかけるというようにしました。

以上です。