Sono nuovo a Ruby on Rails. Stavo cercando di convalidare il formato di uno degli attributi per inserire solo float.
validates :price, :format => { :with => /^[0-9]{1,5}((.[0-9]{1,5})?)$/, :message => "should be float" }
ma quando inserisco solo il carattere nel prezzo, lo accetta e mostra 0.0 valore per il prezzo. qualcuno può dire, cosa c'è di sbagliato in questo o perché questo accade?
risposte:
0 per risposta № 1Un float è un numero e le espressioni regolari sono per le stringhe.
Sembra che quando si inserisce una stringa per il float, viene automaticamente convertito come 0.0 da Rails.
Hai un valore predefinito (0.0) sulla colonna? Se sì, allora puoi provare a rimuoverlo e usarlo validates_presence_of :price
solo.
Qualcosa da provare: invece di mettere la stringa direttamente nel price
colonna, metterlo in un price_string
attr e usa a before_save
callback per provare a convertire la stringa in prezzo. Qualcosa del genere:
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
E nel tuo modulo, cambia il nome di text_field in :price_string
.
9 per risposta № 2
Questa è la mia soluzione,
validates :price,presence:true, numericality: {only_float: true}
quando si inserisce ad esempio 7, il valore viene automaticamente trasferito a 7.0
3 per risposta № 3
Per le rotaie 3:
validates :price, :format => { :with => /^d+??(?:.d{0,2})?$/ },
:numericality =>{:greater_than => 0}