前人未踏の領域へ WEB・インフラ・プログラミング全般編

フロントエンド、バックエンド、インフラ、言語など、アプリ開発、IOT以外の記録

異なるカラム名のモデルに対するバリデーションをConcernで共通化したい

課題

バリデーションを共通化したい。Concernを使いたいがモデルごとに違う名前を割り当ててしまった。 カスタムバリデータは大げさなので使いたくない。どうすればよいか。

対応

ActiveRecordhas_attribute を使うと項目の有無をチェックしてくれるのでそれを使う。

module EmailValidator
  extend ActiveSupport::Concern
  EMAIL_FORMAT = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  included do
    if has_attribute?(:user_mail)
      m = :contact_mail
    elsif has_attribute?(:company_mail)
      m = :mail
    end
    validates m, format: { with: EMAIL_FORMAT,
                           message: I18n.t('activerecord.errors.messages.invalid') },
              presence: false
  end
end

とりあえずできそうだけど書いてて全然イケてる感じがしないので使わないかも。

参考

https://qiita.com/hihats/items/f82b6fd99b18bf9569fd

/* Responsive: yes */