2012-01-13 5 views
3

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

ответ

3

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

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

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

+0

Большое спасибо. Я забыл упомянуть, что 'buy' является вложенным атрибутом. При попытке вашего решения я получаю сообщение об ошибке, которое 'sales_price' является неопределенным методом. Нужно ли мне ссылаться на него по-другому? – Brenda

+0

А, нашел ответ ... тот же, что и выше, но добавив «объект»: значение: number_with_precision (купил.объект.цены, точность: 2) – Brenda

1

Изменить StringInput

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

Я сделал это, изменив поведение регулярных полей ввода, которые Formtastic вызывает StringInput, создав мою собственную версию, как показано на странице Formtastic README.

Код ниже приведен для моделей DataMapper, так что в любое время, когда свойство объявлено как Decimal, на входе будет отображаться правильное количество знаков после запятой. Этот подход может быть изменен для других ОРМ.

# 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 
+0

Очень приятное решение. Я должен попробовать это в своем следующем проекте. – Brenda

Смежные вопросы