Al usar Rails, intento obtener un mensaje de error como "El campo de la canción no puede estar vacío" al guardar. Haciendo lo siguiente:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
... solo muestra "Song Rep XYW no puede estar vacío", lo que no es bueno porque el título del campo no es fácil de usar. ¿Cómo puedo cambiar el título del campo en sí? Podría cambiar el nombre real del campo en la base de datos, pero tengo varios campos de "canción" y necesito tener nombres de campo específicos.
No quiero hackear el proceso de validación de rails y creo que debería haber una forma de solucionarlo.
fuente
errors.add :base, msg
? Me gustaría saber de qué columna se trata el error, para poder mostrarlo en el campo de formulario correcto.The password is wrong.
o enThe email address is not valid.
lugar dePassword is wrong.
yEmail is not valid.
.En su modelo:
En tu opinión
Si lo haces en su lugar
aparece este mensaje de error con el nombre del atributo
si desea obtener el mensaje de error para un solo atributo
fuente
validates_presence_of :address1, :message => :put_some_address_please
Prueba esto.
Encontré esto aquí .
Aquí hay otra forma de hacerlo. Lo que debe hacer es definir un método human_attribute_name en la clase de modelo. El método pasa el nombre de la columna como una cadena y devuelve la cadena para usar en los mensajes de validación.
El código anterior es de aquí.
fuente
Sí, hay una manera de hacer esto sin el complemento. Pero no es tan limpio y elegante como usar el complemento mencionado. Aquí está.
Asumiendo que es Rails 3 (no sé si es diferente en versiones anteriores),
mantén esto en tu modelo:
y en la vista, en lugar de irse
como sería cuando utilizamos el generador de andamios, pon:
Y obtendrá solo el mensaje que especificó en el modelo, sin el nombre del atributo.
Explicación:
Hasta ahora solo estamos mostrando un mensaje, siempre para el primer error. Si desea mostrar todos los errores, puede recorrer el hash y mostrar los valores.
Espero que haya ayudado.
fuente
Código Rails3 con mensajes totalmente localizados:
En el modelo user.rb define la validación
En config / locales / en.yml
fuente
En el método de validación personalizado use:
errors.add(:base, "Custom error message")
como add_to_base ha quedado en desuso.
errors.add_to_base("Custom error message")
fuente
Relacionado con la respuesta aceptada y otra respuesta en la lista :
Estoy confirmando que la bifurcación de custom-err-msg de nanamkim funciona con Rails 5 y con la configuración regional.
Solo necesita comenzar el mensaje de configuración regional con un cursor y no debe mostrar el nombre del atributo en el mensaje.
Un modelo definido como:
con lo siguiente
en.yml
:item.errors.full_messages
mostrará:en lugar de lo habitual
Name You can't create an item without a name
fuente
Recomiendo instalar la gema custom_error_message (o como complemento ) originalmente escrita por David Easley
Te permite hacer cosas como:
fuente
gem "custom_error_message"
a su Gemfile - vea github para más detallesUna solución podría ser cambiar el formato de error predeterminado i18n:
El valor predeterminado es
format: %{attribute} %{message}
fuente
Aquí hay otra manera:
Si usa esta plantilla:
Puede escribir su propio mensaje personalizado como este:
De esta manera, debido al guión bajo, el mensaje completo se convierte en "Mi mensaje personalizado", pero el espacio extra al principio es imperceptible. Si realmente no quieres ese espacio extra al principio, solo agrega el
.lstrip
método.El método String.lstrip eliminará el espacio adicional creado por ': _' y dejará los demás mensajes de error sin cambios.
O incluso mejor, use la primera palabra de su mensaje personalizado como clave:
Ahora el mensaje completo será "Mi mensaje personalizado" sin espacio adicional.
Si desea que el mensaje completo comience con una palabra en mayúscula como "La URL no puede estar en blanco", no puede hacerlo. En su lugar, intente agregar alguna otra palabra como clave:
Ahora el mensaje completo será "La URL no puede estar en blanco"
fuente
errors.add(:_, 'foobar')
y obtener 'foobar' como mensajeSolo hazlo de la manera normal:
Pero muéstrelo así en su lugar
Devoluciones
El método de localización es definitivamente la forma "adecuada" de hacer esto, pero si está haciendo un pequeño proyecto no global y desea comenzar rápidamente, esto es definitivamente más fácil que el salto de archivos.
Me gusta por la capacidad de poner el nombre del campo en otro lugar que no sea el comienzo de la cadena:
fuente
Si desea enumerarlos a todos en una buena lista pero sin usar el nombre grosero no humano, puede hacer esto ...
fuente
En tu opinión
Cuando desee anular el mensaje de error sin el nombre del atributo, simplemente anteponga el mensaje con ^ así:
fuente
Intenté seguir, funcionó para mí :)
1 trabajo.rb
2 jobs_controller.rb
3 _form.html.erb
fuente
Aquí está mi código que puede ser útil para usted en caso de que aún lo necesite: Mi modelo:
Luego he creado un ayudante para mostrar mensajes:
fuente
La única forma en que pude obtener toda la personalización que quería era usar una
after_validation
devolución de llamada para permitirme manipular el mensaje de error.Permita que el mensaje de validación se cree normalmente, no necesita intentar cambiarlo en el asistente de validación.
cree una
after_validation
devolución de llamada que reemplazará ese mensaje de validación en el back-end antes de que llegue a la vista.En el
after_validation
método, puede hacer lo que quiera con el mensaje de validación, ¡como una cadena normal! Incluso puede usar valores dinámicos e insertarlos en el mensaje de validación.El método after_validation tendrá un alcance mucho mayor que el ayudante de validación de rieles incorporado, por lo que podrá acceder al objeto que está validando como está tratando de hacer con object.file_name. Lo que no funciona en el asistente de validación donde está intentando llamarlo.
Nota: utilizamos el
^
para deshacernos del nombre del atributo al comienzo de la validación como @Rystraum señaló haciendo referencia a esta gemafuente
La respuesta de graywh es la mejor si en realidad es diferente para mostrar el nombre del campo. En el caso de un nombre de campo dinámico (basado en otros campos para mostrar), haría algo como esto
el método full_message en el else es lo que usan los rieles dentro del método full_messages, por lo que dará los errores normales de Rails para otros casos (Rails 3.2 y superiores)
fuente