Я пытаюсь проверить сумму в долларах с помощью regex: ^[0-9]+\.[0-9]{2}$
Это хорошо работает, но каждый раз, когда пользователь отправляет форму и концы суммы в долларах в 0 (нулях), рубин (или направляющие?) обрубает 0. Так 500.00 превращается в 500,0 таким образом сбоя regex проверки.
Там какой-либо путь состоит в том, чтобы заставить рубин/направляющие сохранить формат вводимым пользователем, независимо от конечных нулей?
Я предполагаю, что ваша сумма в долларах имеет десятичный тип. Таким образом, любое значение, вводимое пользователем в поле, перед сохранением в базе данных преобразуется из строки в соответствующий тип. Валидация применяется к значениям, уже преобразованным в числовые типы, поэтому regex не совсем подходит для фильтра валидации в вашем случае.
Однако у вас есть пара возможностей решить эту проблему:
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
), и что в некоторых локалях точка не является десятичным разделителем (если вы планируете интернационализировать ваше приложение).
Обычно деньги лучше хранить как целое число в центах (500 центов - это $5.00). Для этого я использую Money gem.
В общем, если вы хотите «запомнить» десятичную точность значения с плавающей запятой, вы должны использовать десятичный тип , а не двоичный тип с плавающей запятой.
С другой стороны, я не уверен, почему вы хотите принудительно использовать строковое представление в такой строгой манере ... Как насчет принятия любого числа и его форматирования, например, number_to_currency
?