Поле форматированного числа с десятичной точностью?

Конечно, мне не хватает чего-то довольно очевидного... У меня есть десятичное значение с точностью 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 ответа

Попробуйте следующее:

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

Sales_price хранится в вашей базе данных с двумя десятичными знаками, но вы должны указывать рельсы для форматирования этого способа при отображении значения.


Изменить параметр 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

licensed under cc by-sa 3.0 with attribution.