Prima di tutto, questo:
def format_values
self.profit.to_s.delete!('^0-9') unless self.profit.nil?
end
è praticamente lo stesso di questo:
def format_values
return if(self.profit.nil?)
p = self.profit
s = p.to_s
s.delete!('^0-9')
end
Quindi non c'è motivo di aspettarsi che il tuo metodo format_values
abbia alcun effetto su self.profit
.
Potreste di cambio di rotta format_values
per assegnare la stringa esaminata a self.profit
ma che non aiuterà perché la logica di pulizia è nel posto sbagliato e verrà eseguito dopo'$1,000'
è stata trasformata in uno zero.
Quando si assegna un valore a una proprietà, ActiveRecord applicherà alcune conversioni di tipo lungo la strada. Cosa succede quando provi a convertire '$1,000'
in un numero? Ovviamente ottieni zero. Puoi guardare questo accada se si gioca in giro per la console:
> a = M.find(id)
> puts a.some_number
11
> a.some_number = 'pancakes'
=> "pancakes"
> puts a.some_number
0
> a.some_number = '$1,000'
=> "1,000"
> puts a.some_number
0
> a.some_number = '1000'
=> "1000"
> puts a.some_number
1000
Così, il vostro pulizia dei dati deve avvenire prima il dato va nell'istanza modello perché non appena AR ottiene le mani sul valore , il tuo '$1,000'
diventerà 0
e tutto è perduto. Metterei la logica nel controller, il lavoro del controller è di mediare tra il mondo esterno e i modelli e la formattazione dei dati e il mangling conta sicuramente come mediazione. Così si potrebbe avere qualcosa di simile nel controller:
def some_controller
fix_numbers_in(:profit)
# assign from params as usual...
end
private
def fix_numbers_in(*which)
which.select { |p| params.has_key?(p) }.each do |p|
params[p] = params[p].gsub(/\D/, '') # Or whatever works for you
end
end
allora tutto sarebbe essere puliti prima di ActiveRecord ottiene le sue piccole mani sporche sui dati e fa un casino di cose.
È possibile eseguire operazioni simili sovrascrivendo il metodo profit=
nel modello, ma questo non è in realtà il lavoro del modello.
/[^ 0-9]/è uguale a/\ D/ – makaroni4
Imita solo il RegExp dell'autore. Cercando di non spaventarlo) – jdoe
grazie @jdoe ho usato il tuo suggerimento e funziona come lo voglio io. –