Ho fatto qualcosa di simile. Formiamo tempi e lunghezze utilizzando un generatore di moduli personalizzato. Si fa uso del text_field esistente, ma avvolge in modo che il valore può essere personalizzato:
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
Ed è usato in questo modo:
<%= form_for(@section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %>
<%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small' %>
<% end %>
Il risultato finale è un valore nell'unità appropriata in base dalla loro scelta su sistema (Metrico, Imperiale) e scala IE piccolo = pollici o millimetri.
Ho praticamente copiato il metodo text_field dal generatore di moduli esistente, che utilizza lo stesso text_field_tag.
Ci sono due trucchi: 1) Conoscere il nome del campo dell'oggetto e come accedere all'oggetto per ottenere il valore che si desidera formattare. 2) Ottenere il nome giusto così quando il modulo viene inviato è parte dell'hash params corretto.
Al generatore di moduli viene assegnata una variabile di classe @object. Puoi ottenere il valore del campo usando il metodo .send.Nel mio caso mando l'etichetta: feed_size_min_w a @object e riprendo la sua lunghezza. Poi lo converto nel mio formato desiderato e lo do al text_field_tag.
Il nome del campo è la chiave per averlo finito nell'hash params, nel mio caso il params [: sezioni] uno. Ho creato una piccola funzione di aiuto chiamata field_name che si occupa di questo.
Infine has_error racchiude il campo in un errore div se vi sono errori su tale etichetta.
ho iniziato una taglia su questa domanda, perché voglio sapere se c'è un risposta migliore di quelle articolate da JDL e da me. Abbi! –