RubyLogo Quand j'écris un formulaire, j'ai pris l'habitude d'écrire mes entrées de texte[1] autour du shéma suivant :

<p><label>%s: %s</label></p>

Ainsi, pour demander un "descriptif de la location", je suis contraint d'écrire ceci [2]:

<p><label>Descriptif de la location: <%= text_field "form", "descriptif_de_la_location" %></label></p>

... ce qui enfreint la règle du Don't Repeat Yourself, et qui est fatiguant tout simplement, lorsque l'on est confronté à plus de 5 inputs du genre.

J'ai donc rajouté ceci à mes helpers (dans app/helpers/application_helper.rb) :

 def winput(input_name, options={})
   pre_options = {
     :markup_scheme => "<p><label>%s: %s</label></p>",
     :text => input_name.capitalize.gsub('_',' '),
     :form_name => 'form',
     :options => {}
   }
   o = pre_options.merge(options)
   markup = text_field o[:form_name], input_name, o[:options]
   return sprintf(o[:markup_scheme], o[:text], markup)
 end

Cet helper me permet de faire exactement la même chose qu'en haut en écrivant seulement :

<%= winput "description_de_la_location" %>

Comme vous le constatez, vous pouvez changer le nom du formulaire, le "markup scheme" (j'ai rien trouvé de mieux sur le coup), et le texte qui va avec. Aussi, les options habituelles du text_field peuvent être aussi passées par le symbol du même nom. Exemple :

<%= winput 'login', :form => 'user', :text => 'Desired login', :options => {:size => 30} %>

... ce qui donnera :

<p><label>Desired login: <input id="user_login" name="user[login]" size="30" type="text" /></label></p>

EDIT (25/11/06) : Je vais vous épargner le code ruby correspondant, mais j'ai un peu amélioré le code afin (entre autres) d'arriver à ce que ceci :

 <% $form_name = 'location' %>
 <%= wtextarea 'descriptif_de_la_location' %>
 <%= wtextarea_f 'situation_geographique' %>
 <%= wtextarea 'tarifs' %>
 <%= winput 'a_partir_de', :text => 'Votre plus bas tarif toutes périodes confondues (en euro)', :after => '€' %>
 <%= radios = radio_button('location', 'animaux_admis', 1, :checked => 'true') + "Oui " + radio_button('location', 'animaux_admis', 0) + "Non"
 markup_scheme 'Les animaux sont-ils admis ?', radios %>

... me sorte cela :

 <p><label>Descriptif de la location :<br /> <textarea cols="40" id="location_descriptif_de_la_location" name="location[descriptif_de_la_location]" rows="20"></textarea></label></p>
 <p><label>Situation geographique (facultatif):<br /> <textarea cols="40" id="location_situation_geographique" name="location[situation_geographique]" rows="20"></textarea></label></p>
 <p><label>Tarifs :<br /> <textarea cols="40" id="location_tarifs" name="location[tarifs]" rows="20"></textarea></label></p>
 <p><label>Votre plus bas tarif toutes périodes confondues (en euro) : <input id="location_a_partir_de" name="location[a_partir_de]" size="30" type="text" value="0" />€</label></p>
 <p><label>Les animaux sont-ils admis ? : <input checked="true" id="location_animaux_admis_1" name="location[animaux_admis]" type="radio" value="1" />Oui <input id="location_animaux_admis_0" name="location[animaux_admis]" type="radio" value="0" />Non</label></p>

L'idée de départ étant d'adapter la méthode à vos besoins, et celon ce qui vous parait pratique. Perso, j'aime.

Notes

[1] Avec le helper text_field 99% du temps

[2] Petites précisions pour les non-utilisateurs de rails : le fait de donner un nom au formulaire dans chaque champ permet de faire la chose suivante newloc = Location.new(params[:form]) pour précharger directement la valeur des champs liés au formulaire, et après rajout d'autres valeurs (newloc.ip_adress = request.remote_ip par exemple), de terminer par un joli newloc.save pour exécuter la requete SQL qui va bien.