質問: date型のフィールドにpresenceとformat(例:2017-01-01)のバリデーションをかけてるのですが、formatの方だけのバリデーションをかけたいときに適当な文字列(fffffなど)を入れたのですが、presenceの方のバリデーションメッセージも入ってきてしまいます。 未入力の時はpresenceのエラーメッセージを、yyyy-mm-dd以外の時はformatのエラーメッセージを出したいときにこれだとどうしたらいいかわかりません。 どうやって対処すればいいですか? ``` :date=>["を入力してください", "は不正な値です"] validates :date, presence: true, format: { with: /[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ } ```
回答: どうしてもしたければ ``` validates :date, presence: true validates :date, format: { with: /[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/ } ,if: "date.present?" ``` とかやるしかないですね。 これは仕様です。 例えば、あなたが登録画面で入力して 登録しようとしたらフリガナはカタカナで入力してくださいと言われ ちっとなって、それを直し再度登録したら 今度はメールアドレスが違いますと言われというのを 何回もくり返されたらどうしますか? 昔はそんなソフトいくつもありましたが、さすがに切れますよね。 そのブチ切れを防ぐためにvalidationは途中で失敗しても最後まで行われ 全てのエラーメッセージが入ります。 当たり前の仕様なので、気になるんだったらifやunnlessで対応してください。 ところで、 >>date型のフィールドにpresenceとformat(例:2017-01-01)のバリデーションをかけてる そもそも、この行為が意味がありません。 Railsはdate型のcolumn(列)にデータが代入されたら まず日付型に変換しようとします。 そこで日付に変換可能 例えば'20170101'だったら'2017-01-01'に変換して保存 そこで日付に変換不可能 例えば'fffffff'だったらデータを破棄します。 なので日付に変換可能かしか判断できないと思います。 どうしても2017-01-01の形式じゃないといやだというのなら html側にformatを指定してください。