/ / Rails: Validates_format_of для плаваючого не працює - ruby-on-рейки, перевірка, плаваюча точка, формат

Rails: Validates_format_of for float not working - ruby-on-rail, перевірка, плаваюча точка, формат

Я є новим в Ruby on Rails. Я намагався перевірити формат одного з атрибутів, щоб ввести лише плаваючий.

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

але коли я ввожу лише символ за ціною, він приймає його та показує значення 0.0 за ціною. Чи може хто-небудь сказати, що це неправильно чи чому це відбувається?

Відповіді:

0 для відповіді № 1

Поплавок - це число, а регулярні вирази - для рядків.

Схоже, що, коли ви вводите рядок для поплавка, він автоматично перетворюється на 0.0 за допомогою Rails.

Чи є у колонці за замовчуванням (0.0)? Якщо так, то ви можете спробувати видалити його та використовувати validates_presence_of :price тільки


Спробуйте щось: замість того, щоб вставити рядок прямо в price стовпчик, помістіть його в a price_string attr і використовувати a 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

І в твоїй формі, змініть назву text_field на :price_string.


9 для відповіді № 2

Це моє рішення,

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

коли ви заповнюєте, наприклад 7, це автоматично переведе значення до 7.0


3 для відповіді № 3

Для рейок 3:

validates :price, :format => { :with => /^d+??(?:.d{0,2})?$/ },
:numericality =>{:greater_than => 0}