He hecho algo similar. Formateamos tiempos y longitudes utilizando un generador de formularios personalizado. Se hace uso de la text_field existente, sino que lo envuelve por lo que el valor puede ser modificado para requisitos:
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
y se utiliza de esta manera:
<%= form_for(@section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %>
<%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small' %>
<% end %>
El resultado final es un valor en unidades apropiadas, basadas fuera de su elección en el sistema (Métrico, Imperial) y escala IE pequeño = pulgadas o milímetros.
B básicamente copié el método text_field del constructor de formulario existente, que usa el text_field_tag mismo.
Hay dos errores: 1) Conocer el nombre del campo del objeto y cómo acceder al objeto para obtener el valor que desea formatear. 2) Obtener el nombre correcto para que cuando se envíe el formulario sea parte del hash de parámetros correcto.
Al generador de formularios se le asigna una variable de clase @object. Puede obtener el valor del campo usando el método .send.En mi caso, envío la etiqueta: feed_size_min_w al @object y recupero su longitud. Luego lo convierto al formato deseado y se lo paso al text_field_tag.
El nombre del campo es clave para que termine en hash de params, en mi caso params [: sections] one. Hice una pequeña función auxiliar llamada field_name que se encarga de esto.
Finalmente, has_error ajusta el campo en un error div si hay errores en esa etiqueta.
que han comenzado una recompensa por esta pregunta porque me gustaría saber si hay una mejor respuesta que las articuladas por JDL y yo. ¡Tienen en él! –