Si vous avez déjà travaillé au développement de plusieurs applications Rails, il est possible qu’un jour, vous vous soyez dit : “J’en ai marre de cette tartine que me génère error_messages_for”.
A force de bidouille par-ci par là vous êtes parvenu à un résultat qui vous convenait. Mais comment afficher les erreurs d’un champ de manière élégante, par exemple, juste à côté du champ ? Le FormBuilder est votre ami !
On aimerait arriver à ce résultat là :

Créons notre Builder lib/error_form_builder.rb qui étend le FormBuilder de ‘base’
1 class ErrorFormBuilder < ActionView::Helpers::FormBuilder 2 end
Dans ce builder, on va surdéfinir les helpers pour les éléments d’un formulaire. Nous ne ferons le détail que pour le textfield, pour les autres éléments, il suffit de suivre le même exemple en analysant bien la structure de l’objet dans le FormBuilder de base.
C’est partit :
1 def text_field(method, options = {}) 2 object = @template.instance_variable_get("@#{@object_name}") 3 unless object.nil? || options[:hide_errors] 4 errors = object.errors.on(method.to_sym) 5 if errors 6 text = " <span class=\"error\"> 7 #{errors.is_a?(Array) ? errors.first : errors}</span>" 8 end 9 end 10 @template.text_field(@object_name, method, 11 objectify_options(options))+text.to_s 12 end
La première chose que l’on fait dans ce nouveau helper text_field, c’est récupérer l’objet. Ensuite on vérifie s’il contient des erreurs relatives à la méthode que l’on passe en paramètre. Et si il y a des erreurs relatives à cette méthode, on vient concaténer un bloc span contenant le premier message d’erreur.
Un peu de css :
1 span.error { 2 color:#c30; 3 float:left; 4 display:block; 5 font-size:1.1em; 6 font-weight:bold; 7 line-height:14px; 8 text-align:left; 9 padding:0px 0 0 5px; 10 width:190px; 11 }
Et voilà ! Une toute nouvelle manière d’ajouter les erreurs dans vos formulaires, et pour pas des masses d’effort ;)