Rails: Validates_format_of для поплавка не работает - PullRequest
5 голосов
/ 15 ноября 2011

Я новичок в Ruby on Rails. Я пытался проверить формат одного из атрибутов, чтобы ввести только float.

validates :price, :format => { :with => /^[0-9]{1,5}((\.[0-9]{1,5})?)$/, :message => "should be float" }

но когда я ввожу только символ в цене, он принимает его и показывает значение 0.0 для цены. Кто-нибудь может сказать, что в этом плохого или почему это происходит?

Ответы [ 3 ]

10 голосов
/ 27 апреля 2014

Это мое решение,

validates :price,presence:true, numericality: {only_float: true}

, когда вы заполняете, например, 7, оно автоматически переводит значение в 7.0

3 голосов
/ 28 сентября 2012

Для рельсов 3:

validates :price, :format => { :with => /^\d+??(?:\.\d{0,2})?$/ }, 
:numericality =>{:greater_than => 0}
0 голосов
/ 15 ноября 2011

Число с плавающей запятой - это число, а регулярные выражения - для строк.

Похоже, что когда вы вводите строку для числа с плавающей запятой, Rails автоматически конвертирует ее в 0.0.по умолчанию (0,0) на столбце?Если да, то вы можете попробовать удалить его и использовать только validates_presence_of :price.


Что-то попробовать: вместо помещения строки непосредственно в столбец price, поместите ее в атрибут price_stringи используйте обратный вызов before_save, чтобы попытаться преобразовать строку в цену.Примерно так:

attr_accessor :price_string

before_save :convert_price_string

protected
  def convert_price_string
    if price_string
      begin
        self.price = Kernel.Float(price_string)
      rescue ArgumentError, TypeError
        errors.add(ActiveRecord::Errors.default_error_messages[:not_a_number])
      end
    end

И в вашей форме измените имя текстового поля на :price_string.

...