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

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

バリデーションを項目ごとに1つにしたい

課題

ある項目に対して数値チェックと存在チェックを行いたい。数値チェックがNGな時点で存在チェックを満たさないのは自明なので これをスキップしたい。どうするのが良いか。

対応

バリデーションがNGだった項目は errorsにaddされるので、その存在チェックをする

validats :code, length: { is: 3 }
validats :code, numericality:true  unless errors.include?(:code)?

ここで errors[:code].blank? でも同じようなことができるのだが、errors内に:codeが作られてしまっていた。
active_model/errors.rb には include? メソッドが用意されているのでそちらを使うのが良さそう。

参考

teratail.com

/* Responsive: yes */