validatesについて、presenceと他の制約が一緒に表示されてしまうのをなんとかしたい。という質問をよく受けます。そこで、解決策をまとめておくことにしました。
##エラーメッセージが重複で表示される
contact.rb
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}
この場合、何も入力しないと
・メールアドレスが入力されていません。
・メールアドレスが不正な値です。
※あらかじめエラーメッセージは、日本語化しています。
と表示されてしまいます。
エラーメッセージが重複するのを防ぐ方法
contact.rb
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, format: {with: VALID_EMAIL_REGEX}, allow_blank: true
validates :email, presence: true
このように書くことで、何も入力しない場合でも
・メールアドレスが入力されていません。
とエラーメッセージが重複するのを防ぐことができます。
ポイント1
allow_blank: true
とすることで、validates :email, format: {with: VALID_EMAIL_REGEX}
が、メールアドレス(email)の入力が空の時に実行されないようにします。
ポイント2
validatesを2つに分けることで、 allow_blank: true
が validates :email, format: {with: VALID_EMAIL_REGEX}
にかからないようにします。
補足
validates :email,
presence: true,
format: {with: VALID_EMAIL_REGEX, allow_blank: true}
このように一行で記述することもできます!