Railsで共通のバリデーションをまとめて書く方法
備忘録のために投稿します。
やりたいこと
Railsでバリデーション書く際に
validates :nickname, presence: true
validates :birthday, presence: true
validates :email, presence: true
・
・
・
みたいにpresence: trueが共通なのに同じことを各カラムに対して書くのはDRYに反するし、綺麗じゃないなと思い、共通のバリデーションをまとめて書く方法を調べてみました。
結論
こんな感じで書くとまとめて記述できました。
with_options presence: true do
validates :nickname
validates :birthday
validates :email, uniqueness: {case_sensitive: false},
format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i}
validates :password, length: {minimum: 7}
with_options format: {with: /\A(?:\p{Hiragana}|\p{Katakana}|[ー-]|[一-龠々])+\z/} do
validates :first_name
validates :last_name
end
with_options format: {with: /\A[ァ-ヶー-]+\z/} do
validates :first_name_kana
validates :last_name_kana
end
end
with_optionsというメソッドのdo〜end内のバリデーションが指定のオプションが付与されるみたいです。
その中でwith_optionをネストさせると、例えばfirst_name,last_nameカラムに対してはpresence: trueとformatのバリデーションが付与されることになります。
ただこれが見やすいのかどうかは少し疑問です。
この記事が気に入ったらサポートをしてみませんか?