まず第一に、これ:
def format_values
self.profit.to_s.delete!('^0-9') unless self.profit.nil?
end
これとほとんど同じです:
def format_values
return if(self.profit.nil?)
p = self.profit
s = p.to_s
s.delete!('^0-9')
end
format_values
したがって、メソッドが に何らかの影響を与えると期待する理由はありませんself.profit
。
format_values
もちろん、処理された文字列を割り当てるように変更することもできますがself.profit
、クレンジング ロジックが間違った場所にあり、ゼロに変わった後に実行されるため、それは役に立ちません。 '$1,000'
プロパティに値を代入すると、ActiveRecord は途中でいくつかの型変換を適用します。数値に変換しようとするとどうなります'$1,000'
か? もちろんゼロになります。コンソールで遊んでみると、これが起こっているのを見ることができます:
> 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
したがって、データがモデル インスタンスに入る前にデータのクリーンアップを行う必要があります。AR が値を取得するとすぐに'$1,000'
、0
すべてが失われるからです。コントローラーにロジックを入れます。コントローラーの仕事は、外界とモデルの間を仲介することであり、データのフォーマットとマングリングは確かに仲介としてカウントされます。したがって、コントローラーに次のようなものを含めることができます。
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
そうすれば、ActiveRecord が汚れたデータを手に入れて混乱を招く前に、すべてがクリーンになります。
モデルのメソッドをオーバーライドすることで同様のことを行うことができますprofit=
が、それは実際にはモデルの仕事ではありません。