J'ai fait quelque chose de similaire. Nous formons les heures et les longueurs en utilisant un générateur de formulaire personnalisé. Il utilise la text_field existante, mais il enveloppe de sorte que la valeur peut être personnalisée:
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
Et il est utilisé comme ceci:
<%= form_for(@section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %>
<%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small' %>
<% end %>
Le résultat final est une valeur dans l'unité appropriée en fonction hors de leur choix sur le système (métrique, impérial) et l'échelle IE petit = pouces ou millimètres.
J'ai fondamentalement copié la méthode text_field du constructeur de formulaire existant, qui utilise lui-même la balise text_field_tag.
Il y a deux gotchas: 1) Connaître le nom du champ d'objet et comment accéder à l'objet pour obtenir la valeur que vous voulez formater. 2) Obtenir le bon nom, donc quand le formulaire est soumis, il fait partie du hash params correct.
Le générateur de formulaire reçoit une variable de classe @object. Vous pouvez obtenir la valeur du champ en utilisant la méthode .send.Dans mon cas, j'envoie l'étiquette: feed_size_min_w à l'objet @object et récupère sa longueur. Je le convertis ensuite au format désiré et je le donne à text_field_tag.
Le nom du champ est la clé pour qu'il finisse dans le hash de params, dans mon exemple les params [: sections] one. J'ai fait une petite fonction d'assistance appelée field_name qui s'occupe de ça.
Enfin, le has_error enveloppe le champ dans un div d'erreur s'il y a des erreurs sur cette étiquette.
J'ai commencé une prime sur cette question parce que je veux savoir s'il y a un meilleure réponse que celles exprimées par JDL et moi-même. Avoir à cela! –