当然我错过了一些非常明显的东西......我有一个十进制精度为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
答案 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)
我是通过创建自己的版本来修改常规输入字段的行为(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