Я предполагаю, что ваша сумма в долларах имеет десятичный тип. Таким образом, любое значение, введенное пользователем в поле, преобразуется из строки в соответствующий тип перед сохранением в базе данных. Валидация применяется к значениям, уже преобразованным в числовые типы, поэтому регулярное выражение на самом деле не является подходящим фильтром проверки в вашем случае.
У вас есть несколько способов решить эту проблему, однако:
- Используйте
validates_numericality_of
. Таким образом, вы полностью оставляете конвертацию в Rails и просто проверяете, находится ли сумма в заданном диапазоне.
- Используйте метод
validate_each
и кодируйте свою логику проверки самостоятельно (например, проверьте, имеет ли значение более 2 десятичных цифр).
- Проверка атрибута до его типизации :
Это особенно полезно в
проверки ситуаций, когда пользователь
может предоставить строку для целого числа
поле, и вы хотите отобразить
исходная строка вернулась с ошибкой
сообщение. Доступ к атрибуту
обычно вводит строку в
0, что не то, что вы хотите.
Итак, в вашем случае вы сможете использовать:
validates_format_of :amount_before_type_cast, :with => /^[0-9]+\.[0-9]{2}$/, :message => "must contain dollars and cents, seperated by a period"
Обратите внимание, однако, что пользователям может показаться утомительным следовать вашим жестким правилам ввода (я бы действительно предпочел иметь возможность набирать 500
вместо 500.00
, например), и что в некоторых локалях период не является десятичным разделитель (если вы планируете интернационализировать свое приложение).