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
label
como elinput
están envueltos? ¿Cómo decide Rails qué envolver?f.label :password
yf.password_field :password
en el@resource.errors
habría un[:password]
conjunto de errores.La diferencia visual que está viendo está sucediendo porque el
div
elemento 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
.display
propiedad que se usa antes de agregar este CSS es lablock
que 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_errors
para 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
div
adició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:
input
ylabel
tiene su propioclass
atributo en cualquier lugar<input type="my-field" class="control">
<label class="active" for="...">My field</label>
input
olabel
no tienen unclass
atributo<input type="my-field">
<label for="...">My field</label>
label
etiqueta tiene otra etiqueta dentro con elclass attribute
<label for="..."><i class="icon-name"></i>My field</label>
En todos esos casos, la
error
clase se agregará a las clases existentes en elclass
atributo 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 :p
llamadas correspondientes recibirán lafields_with_errors
etiqueta css. El resto recibirá laerror
clase 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
div
actuará como unaspan
y que no interfiera con su diseño (ya quediv
es un elemento de bloque -display: block;
- por defecto, se hará una nueva línea después de que se cierra;span
esinline
, 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_proc
para 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