Campo de correo electrónico:
<label for="job_client_email">Email: </label>
<input type="email" name="job[client_email]" id="job_client_email">
Se ve como esto:

Pero, si la validación del correo electrónico falla, se convierte en:
<div class="field_with_errors">
<label for="job_client_email">Email: </label>
</div>
<div class="field_with_errors">
<input type="email" value="wrong email" name="job[client_email]" id="job_client_email">
</div>
que se ve así:

¿Cómo podría evitar este cambio de apariencia?
ruby-on-rails
ruby-on-rails-3
validation
field-with-errors
Misha Moroshko
fuente
fuente

Respuestas:
Deberías anularlo
ActionView::Base.field_error_proc. Actualmente se define como esto dentro deActionView::Base:Puede anularlo colocando esto en la clase de su aplicación dentro de
config/application.rb:Reinicie el servidor de rails para que este cambio surta efecto.
fuente
labelcomo elinputestán envueltos? ¿Cómo decide Rails qué envolver?f.label :passwordyf.password_field :passworden el@resource.errorshabría un[:password]conjunto de errores.La diferencia visual que está viendo está sucediendo porque el
divelemento es un elemento de bloque. Agregue este estilo a su archivo CSS para que se comporte como un elemento en línea:fuente
display:propiedad utilizada (y otros estilos de diseño) en elhtml_tag.displaypropiedad que se usa antes de agregar este CSS es lablockque está causando la diferencia visual que no se desea. No niega ningún otro estilo de diseño en la etiqueta. Sin embargo, la respuesta de Ryan Bigg es perfecta si desea cambiar / eliminar la etiqueta que envuelve el campo con errores.Actualmente uso esta solución, colocada en un inicializador:
Esto me permite simplemente agregar un nombre de clase a la etiqueta apropiada, sin crear elementos adicionales.
fuente
label.El código adicional está siendo agregado por
ActionView::Base.field_error_proc. Si no está utilizandofield_with_errorspara diseñar su formulario, puede anularlo enapplication.rb:Alternativamente, puede cambiarlo a algo que se adapte a su IU:
fuente
Estoy trabajando con Rails 5 y Materialize-Sass y estoy teniendo algunos problemas con el comportamiento predeterminado de Rails para tratar validaciones de campo fallidas como en la imagen a continuación y fue debido a la
divadición adicional a los campos de entrada donde falló la validación.Trabajando con @Phobetron answer y modificando la respuesta de Hugo Demiglio también. Hice algunos ajustes a esos bloques de código y consigo que algo funcione bien en los siguientes casos:
inputylabeltiene su propioclassatributo en cualquier lugar<input type="my-field" class="control"><label class="active" for="...">My field</label>inputolabelno tienen unclassatributo<input type="my-field"><label for="...">My field</label>labeletiqueta tiene otra etiqueta dentro con elclass attribute<label for="..."><i class="icon-name"></i>My field</label>En todos esos casos, la
errorclase se agregará a las clases existentes en elclassatributo si existe o se creará si no está presente en la etiqueta o en las etiquetas de entrada .Espero que pueda ser útil para alguien con las mismas condiciones como yo.
fuente
Además de la respuesta @phobetron, que no funciona cuando tiene otra etiqueta con atributo de clase, como
<label for="..."><i class="icon my-icon"></i>My field</label>.Hice algunos cambios en su solución:
fuente
Si por alguna razón todavía estás trabajando en Rails 2 (como yo), mira la publicación SO aquí .
Ofrece un script para poner en inicializadores.
fuente
Una cosa a tener en cuenta (como descubrí trabajando en esto hoy) es que si flota los campos de etiqueta o de entrada (estoy flotando todos los campos de entrada a la derecha), el CSS se interrumpirá incluso si anula ActionView :: Base.field_error_proc.
Una alternativa es dejar caer un nivel más profundo en el formato CSS de esta manera:
fuente
Hice una opción para deshabilitar esta cosa terrible para algunos objetos
Entonces puede usarlo así:
fuente
Esta es mi solución basada en la respuesta de @ Phobetron. Al colocar este código
application.rb, sus etiquetas<p>y<span>generadas por lasform.error :pllamadas correspondientes recibirán lafields_with_errorsetiqueta css. El resto recibirá laerrorclase CSS.De esta manera, encontré el más flexible y discreto de todos los anteriores para diseñar la respuesta en mis formularios.
fuente
Si es solo para fines de estilo (no le importa
div), puede agregar esto a su CSS:La
divactuará como unaspany que no interfiera con su diseño (ya quedives un elemento de bloque -display: block;- por defecto, se hará una nueva línea después de que se cierra;spanesinline, por lo que no lo hace).fuente
Si solo desea desactivar los errores de ciertos elementos, por ejemplo , casillas de verificación , puede hacer esto:
fuente
Si solo se trata de problemas de estilo, podemos sobrescribir "field_with_errors". Pero como eso podría afectar a otros formularios en nuestra aplicación, es mejor sobrescribir la clase "field_with_errors" solo en ese formulario.
Teniendo en cuenta 'parent_class' es una de las clases principales para el campo de error del formulario (ya sea la clase del formulario o la clase de cualquiera de los elementos principales para el campo de error), entonces
Solucionará el problema y no perturbará ninguna otra forma en nuestra aplicación.
O
Si necesitamos anular el estilo de "field_with_errors" para toda la aplicación, entonces como dijo @dontangg,
Hará la solución. Espero eso ayude :)
fuente
Si no desea cambiar
field_error_procpara toda su aplicación, jQuery's wraprap puede proporcionar una solución más específica para áreas problemáticas específicas, por ejemplo,fuente