課題
バリデーションを共通化したい。Concernを使いたいがモデルごとに違う名前を割り当ててしまった。 カスタムバリデータは大げさなので使いたくない。どうすればよいか。
対応
ActiveRecordの has_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 = :user_mail elsif has_attribute?(:company_mail) m = :company_mail end validates m, format: { with: EMAIL_FORMAT, message: I18n.t('activerecord.errors.messages.invalid') }, presence: false end end
とりあえずできそうだけど書いてて全然イケてる感じがしないので使わないかも。