Fixing fieldWithErrors behavior

Dealing with errors in Rails forms can be a hard task. When a form field has errors, ActionView wraps the input in a div of class “fieldWithErrors”. The result is something like this

<p><div class="fieldWithErrors"><input id="user_name" name="user[name]" type="text" value="" /></div></p>

A div inside a paragraph ?¿?¿? This behavoir can be very annoying and isn’t XHTML compliant. A simple solution is add this line at the end of environemnt.rb or in a file under lib dir:

ActionView::Base.field_error_proc = Proc.new { |html_tag, instance| "<span class=\"fieldWithErrors\">#{html_tag}</span>" }

This is the result

<p><span class="fieldWithErrors"><input id="user_name" name="user[name]" type="text" value="" /></span></p>

A single line that simplifies your life ;)

Related Posts

9 Responses to “Fixing fieldWithErrors behavior”

  1. derekpm Says:

    Rather interesting. Has few times re-read for this purpose to remember. Thanks for interesting article. Waiting for trackback

  2. Andrés Gutiérrez Says:

    Una pregunta, yo tengo este código:

    Me genera esto:

    Email

    Lo que me gustaría es conseguir esto:

    Email

    Error de validación

    No sé si se entiende, lo que quiero es por un lado mostrar el texto del error dentro de un TAG . Esto es fácil.
    Pero luego tengo dos problemas:
    1- ¿Como asignar una clase al div contenedor de html_tag?
    2- Como lo tengo, rails tambien detecta a mi label como un html_tag. Por lo que también le añade el mensaje de error. Cosa fea.

    Aquí hacen algo [1], pero no soy capaz de adaptarlo a lo que quiero.

    [1] http://dev.rubyonrails.org/ticket/7425

  3. Andrés Gutiérrez Says:

    Perdón me ha escapado todo el HTML. \:O
    Basicamente la idea es los input rodeados de un div y acompañados de un label con el atriubuto for igual al id del input.

    Y el error sería ese mismo DIV pero con un class=”error”. y el texto del error debajo del INPUT en un EM tag.

    Y luego las preguntas que he planteado arriba.

  4. Emili Says:

    WP se ha comido el código html, para poner tags debes usar los códigos ascii
    http://www.ascii.cl/es/

  5. Andrés Gutiérrez Says:

    Gracias Emili, lo tendré en cuenta para la próxima. Alguna idea con mi problema. Si quieres posteo el HTML con ASCII.

    Un saludo

  6. Andrés Gutiérrez Says:

    Al tema de cómo evitar que me añada el error de validación a los labels, lo he resuelto así [1]

    Ahora me queda la duda de saber si puedo acceder desde ahí al DIV contenedor de los dos html_tag que tengo LABEL e INPUT. ¿Se podrá?

    [1] http://pastie.org/616665

  7. Andrés Gutiérrez Says:

    Para que quede claro lo que pretendo. Andrew Vit ha expuesto lo que yo quiero hacer en un ticket de lighthouse [1]

    Aunque pienso que la gente de Rails no piensa lo mismo. Porque parece que no le han hecho mucho caso. Y creo que no es algo trivial lo que el propone. En fin, de momento tiraré con lo que puse en el mensaje anterior que es poner la clase css en los inputs (más o menos la opción que propone Adam Milligan)

    NOTA:
    He leido que un archivo en initializers también es buen sitio para colocar un archivo del estilo…field_erros.rb

    Un saludo

    [1]https://rails.lighthouseapp.com/projects/8994/tickets/1626-fieldwitherrors-shouldnt-use-a-div#ticket-1626-35

    [2] https://rails.lighthouseapp.com/projects/8994/tickets/1626-fieldwitherrors-shouldnt-use-a-div#ticket-1626-9

  8. Emili Says:

    La verdad es que este tema trae cola. En el tema del HTML cada uno tiene sus preferencias y al final acabas personalizando lo que necesitas , que crear un archivo con tus modificaciones lo metes en initializers y marchando.

  9. Andrés Gutiérrez Says:

    Pues marchando, eso he hecho. De momento lo dejo aparcado…seguro que me vuelvo a enfrentar en otro momento a este problema.

    Gracias,

    Un saludo

Leave a Reply

Comments for this post will be closed on 21 January 2010.