Rails: почему проверка формата (regex) не проходит? - PullRequest
2 голосов
/ 17 декабря 2010

У меня есть следующая проверка цены товара:

class Product < ActiveRecord::Base
    ...
    PRICE_REGEX = /^([1-9]\d{0,5}|0)(\.\d{1,2})?$/
    validates :price, :presence => true, :format => PRICE_REGEX
    ...
end

Предполагается, что цены могут быть от 0 до 999999.99.

Однако, если я введу hello,проверка проходит успешно, и 0.00 сохраняется в базе данных.

Однако проверка :presence работает нормально.

Что мне здесь не хватает?

Ответы [ 2 ]

5 голосов
/ 17 декабря 2010

Столбец цены представляет собой число с плавающей точкой, поэтому Rails автоматически преобразует строку «привет» в число с плавающей точкой, как указано в "hello".to_f # => 0.0 Затем он преобразуется обратно в строку "0.0", которая, очевидно, соответствует регулярному выражению.

В целом, использование регулярных выражений в нестроковых столбцах - плохая идея. Вместо этого используйте validates_numericality_of. Если вам нужно то же ограничение, что и с регулярным выражением, сделайте это так:

class Product < ActiveRecord::Base
  validates_numericality_of :price, :greater_than => 0, :less_than => 1000000
end

Мало того, что это безопаснее, но и легче читать и следовать. Обратите внимание, что он также автоматически отклонит цену, если она будет пустой.

0 голосов
/ 17 декабря 2010

Я не проверял это, но каждое описание, которое я видел из проверок, использует: формат таким образом:

validates :price, :presence => true, :format => { :with => PRICE_REGEX }

Возможно, проблема здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...