条件によってバリデーションの内容を変更したい時、with_optionsを使えば簡単にまとめることができる。
使い方
例)店舗検索を条件によってフォーム内容を変更する場合
- 現在地から検索(緯度経度)
- 店舗名から検索(ワード)
- 都道府県から検索(都道府県と市町村を選択)
model
# 現在地から検索
with_options if: :location? do |v|
v.validates :lat, presence: true
v.validates :lon, presence: true
end
# 店舗名から検索
with_options if: :shop_name? do |v|
v.validtes :word, length: { in: 2..20 }
end
# 都道府県から検索
with_options if: :area? do |v|
v.validates :pref, presence: true
v.validates :city, presence: true
end
rails4.2では少し簡略して書くことができます。
model
with_options if: :location? do
validates :lat, presence: true
validates :lon, presence: true
end
注意点
with_optionsの中でさらにif
を定義した場合
model
with_options if: :location? do
validates :lat, presence: true
validates :lon, presence: true, if: :lat
end
上記のような場合、with_options
ブロック内のif
で上書きされてしまいうまく動作しません。
with_options
のブロック内ではif,unless
オプションは使わない方がいいです。
やむをえず使用する場合はwith_options
で定義したものと逆のものを使います。
model
with_options if: :location? do
validates :lat, presence: true
validates :lon, presence: true, unless: 'lat.blank?'
end