見出し画像

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のバリデーションが付与されることになります。

ただこれが見やすいのかどうかは少し疑問です。


この記事が気に入ったらサポートをしてみませんか?