Formtastic числовое поле с десятичной точностью? - PullRequest
5 голосов
/ 14 января 2012

Конечно, я упускаю что-то довольно очевидное ... У меня есть поле, которое является десятичным с точностью до 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

View

%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 ]

4 голосов
/ 14 января 2012

Попробуйте это:

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

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

1 голос
/ 12 мая 2012

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