Я є новим в 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}