在保存到数据库之前,如何操作回调中的十进制或整数列

时间:2011-07-15 06:44:34

标签: ruby-on-rails callback

我有一个模型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 %>

1 个答案:

答案 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