带小数精度的Formtastic数字字段?

时间:2012-01-13 21:56:20

标签: ruby-on-rails formtastic

当然我错过了一些非常明显的东西......我有一个十进制精度为2的字段,但Formtastic只显示一个小数,除非实际值有2个位置。我错过了什么?

型号:

create_table "items", :force => true do |t|
    t.string   "item_number"
    t.integer  "buyer_id"
    t.integer  "seller_id"
    t.string   "description"
    t.decimal  "sales_price", :precision => 10, :scale => 2, :default => 0.0
    t.datetime "created_at"
    t.datetime "updated_at"
end

查看

%td= bought.input :sales_price, input_html: { class: 'span2'}, label: false

从下面注意到答案,其他人在以后发现这一点可能并不清楚:

%td= bought.input :sales_price, input_html: { class: 'span2', value: number_with_precision(bought.object.sales_price, precision: 2)}, label: false

2 个答案:

答案 0 :(得分:4)

试试这个:

%td= bought.input :sales_price, input_html: { class: 'span2', value: number_with_precision(bought.sales_price, precision: 2) }, label: false

Sales_price存储在您的数据库中,带有两个小数位,但您必须告诉rails在显示值时将其格式化。

答案 1 :(得分:1)

修改StringInput

@ xnm的回答对我很有帮助,但是对每个输入执行此操作都会很乏味,所以我更进一步解决了整个应用程序的问题。

我是通过创建自己的版本来修改常规输入字段的行为(Formtastic调用StringInput),如Formtastic README中所示。

下面的代码适用于DataMapper模型,因此只要属性声明为Decimal,输入就会显示正确的小数位数。可以针对其他ORM修改此方法。

# app/inputs/string_input.rb

# Modified version of normal Formtastic form inputs.
# When creating an input field for a DataMapper model property, see if it is
# of type Decimal. If so, display the value with the number of decimals
# specified on the model.
class StringInput < Formtastic::Inputs::StringInput
  def to_html
    dm_property = @object.class.properties.detect do |property| 
      property.name == @method
    end rescue nil

    if dm_property && dm_property.class == DataMapper::Property::Decimal
      @options[:input_html] ||= {}
      @options[:input_html][:value] ||= @template.number_with_precision(

        # What DataMapper calls "scale" (number of digits right of the decimal),
        # this helper calls "precision"
        @object.send(@method), precision: dm_property.options[:scale]
      )
    end

    super
  end
end