Я сделал нечто подобное. Мы форматируем время и длину, используя собственный конструктор форм. Он использует существующее текстовое поле, но упаковывает его так, что значение может быть настроено:
class SuperFormBuilder < ActionView::Helpers::FormBuilder
include ApplicationHelper
include FormHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::FormTagHelper
def length_field(label,*args)
scale = 'medium'
args.each do |v|
if v.has_key?(:scale)
scale = v[:scale]
v.delete(:scale)
end
end
value = length_conversion(@object.send(label.to_sym),scale)
options = (args.length > 0) ? args.pop : {}
return has_error(label, text_field_tag(field_name(label),value,*args) + ' ' + length_unit(scale))
end
private
def field_name(label)
return @object_name + "[#{label}]"
end
def has_error(label, output)
return "<div class='fieldWithErrors'>#{output}</div>" if @object.errors[label]
return output
end
И это используется так:
<%= form_for( @section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %>
<%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small' %>
<% end %>
Конечным результатом является значение в соответствующей единице, основанное на их выборе по системе (метрическая, британская) и шкале IE small = дюймы или миллиметры.
Я в основном скопировал метод text_field из существующего построителя форм, который использует сам text_field_tag.
Есть две ошибки: 1) Зная имя поля объекта и как получить доступ к объекту, чтобы получить значение, которое вы хотите отформатировать. 2) Получение правильного имени, чтобы при отправке формы она была частью правильного хэша params.
Конструктор форм получает переменную класса @object. Вы можете получить значение поля, используя метод .send. В моем случае я отправляю метку: feed_size_min_w в @object и возвращаю ее длину. Затем я преобразую его в желаемый формат и передам text_field_tag.
Имя поля является ключом к тому, чтобы оно попадало в хэш params, в моем случае это params [: section] единица. Я сделал небольшую вспомогательную функцию с именем field_name, которая позаботится об этом.
Наконец has_error упаковывает поле в div ошибки, если на этой метке есть ошибки.