У меня есть модель рельсов, которая имеет 7 числовых атрибутов, заполненных пользователем через форму.
Мне нужно проверить наличие каждого из этих атрибутов, что, очевидно, легко, используя
validates :attribute1, :presence => true
validates :attribute2, :presence => true
# and so on through the attributes
Однако мне также нужно запустить специальный валидатор, который принимает несколько атрибутов и выполняет некоторые вычисления с ними. Если результат этих вычислений не находится в определенном диапазоне, то модель должна быть объявлена недействительной.
Собственно, это тоже легко
validate :calculations_ok?
def calculations_ok?
errors[:base] << "Not within required range" unless within_required_range?
end
def within_required_range?
# check the calculations and return true or false here
end
Однако проблема в том, что метод "validate" всегда запускается до того, как метод "проверяет". Это означает, что если пользователь оставляет одно из обязательных полей пустым, рельсы вызывают ошибку, когда он пытается выполнить вычисление с пустым атрибутом.
Итак, как я могу сначала проверить наличие всех необходимых атрибутов?