我有一个模型Factsheet
,它有一些十进制列,用于输入一些$值(价格)。我需要输入$1,000,000.00
之类的值,并在保存之前从中计算原始值。如果我执行保存,在任何格式化之前,它会将其保存为1.00
"$1,000,000.00".to_f = 1.0
我试图执行before_save回调,并在保存之前仅从列中提取数字和点。我是这样做的:
class Factsheet < ActiveRecord::Base
before_save :convert_to_decimal
def convert_to_decimal
self.shopping_center_size = decimal_value(shopping_center_size)
self.cam = decimal_value(cam)
self.tax = decimal_value(tax)
#... some other manipulations
end
def decimal_value(string)
string ? string.gsub(/[^\d\.]/, "") : string
end
end
但是,由于Rails将参数转换为BigDecimal
(我认为它对字符串执行to_f
),此代码无效。所以当我执行此代码时,我得到NoMethod gsub for BigDecimal
。我知道在保存之前我可以操纵控制器本身的params
,或者将params
传递给模型中的类方法并在那里操作它。但是,这两种选择似乎都不对。无论如何,我可以在回调本身中操纵它们吗?
控制器:
def FactsheetsController < ApplicationController
def new
@factsheet = Factsheet.new
end
def create
@factsheet = Factsheet.new(params[:factsheet])
if @factsheet.save
flash[:notice] = "Factsheet created successfully"
redirect_to @factsheet
else
render :action => "new"
end
end
def edit
@factsheet = Factsheet.find(params[:id])
end
def update
@factsheet = Factsheet.find(params[:id])
if @factsheet.update_attributes(params[:factsheet])
flash[:notice] = "Factsheet updated successfully"
redirect_to @factsheet
else
render :action => "edit"
end
end
end
查看:
_form.html.erb
# Here user should be able to enter values like $1,000,000.00
# and it should be correctly saved to database as 1000000.0
<%= form.text_field :cam %>
<%= form.text_field :tax %>
答案 0 :(得分:0)
您可以覆盖模型中每个字段的set方法,如下所示:
def shopping_center_size=(num)
self[:shopping_center_size] = decimal_value(num)
end
def cam=(num)
self[:cam] = decimal_value(num)
end
def tax=(num)
self[:tax] = decimal_value(num)
end