en mi página de edición de usuario, hay una línea de la siguiente manera:
<%= devise_error_messages! %>
El problema es que esto no genera errores de la manera estándar que hace el resto de la aplicación:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
Mi pregunta es, ¿cómo hago para que el mensaje de error de diseño funcione como los demás que usan el flash cada uno?
Gracias.
ruby-on-rails
devise
Un aprendiz
fuente
fuente
Respuestas:
Estoy tratando de resolver esto yo mismo. Acabo de encontrar este problema registrado en Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
José dice que el
devise_error_messsages!
método es solo un trozo (aunque contiene implementación) y que se supone que debemos anularlo / reemplazarlo. Hubiera sido bueno que esto se señalara en algún lugar de la wiki, por lo que supongo que hay algunas personas como nosotros que han estado adivinando.Así que voy a intentar volver a abrir el módulo y redefinir el método, anulando efectivamente la implementación predeterminada. Te diré cómo va.
Actualizar
Sí, eso funciona. Lo creé
app/helpers/devise_helper.rb
y lo anulé así:Entonces, sabiendo esto, puedo modificar el método para mostrar los mensajes de error de la manera que quiero.
Para ayudarlo a resolver su problema original: Aquí está el original
devise_helper.rb
en Github . Eche un vistazo a cómo se atraviesan los mensajes de error:Eso debería ayudarte a comenzar. :)
Otra actualización
El
resource
objeto es en realidad el modelo que está utilizando el dispositivo (figura).También parece estar definido en un alcance más alto (probablemente proveniente del controlador), por lo que se puede acceder en una variedad de lugares.
En cualquier lugar de tu ayudante
Su vista
fuente
La siguiente solución funciona con el último dispositivo hasta ahora (4.1.1) y Rails 4.2.6. Pero es tan simple que no veo la razón por la cual no funcionaría dentro de 10 años;)
Si desea reciclar sus mensajes de error y hacer que se vean de la misma manera en su aplicación, recomendaría algo como esto (como aprendí con Michael Hartl tut):
Crear parciales para mensajes de error:
layouts/_error_messages.html.erb
poner dentro del siguiente código (aquí uso algunas clases de bootstrap 3):Ahora tiene algo reciclable y puede usarlo en todos los ámbitos. En lugar del dispositivo estándar:
Llámalo en tu formulario así:
Puedes ponerlo en cualquier forma. En lugar de pasar recursos de diseño, puede pasar variables de su formulario de esta manera:
fuente
Sé que ha pasado un tiempo desde que se publicó esta pregunta, pero solo quería comentar lo que he encontrado. Las dos personas que ya respondieron han sido de gran ayuda para mí y solo quería contribuir.
Verá en todo el dispositivo que hay llamadas usando
render_with_scope
. Creo que este es un método definido por idear y básicamente aplica el alcance actual a la siguiente vista representada.¿Por qué es esto relevante? El dispositivo contiene sus errores dentro
resource.errors
( no@resource.errors
). Idear funciona bien si quieres usarlo de fábrica, por así decirlo.Surgen problemas con estos errores si comienza a cambiar su comportamiento de administración de usuarios. Al agregar un
redirect_to
orender
(en lugar derender_with_scope
) donde Devise no tenía uno anteriormente, básicamente está arrojando los mensajes de error. Esto hace que Devise sea hostil a la modificación, en mi opinión.Mi solución es esta
y
El último bloque de código toma los mensajes de error de Devise como una matriz y los agrega
flash[:notice]
(como una matriz). Cada mensaje se imprimirá una línea a la vez. Si tengo tiempo, creo que voy a cambiar la forma en que Devise maneja los mensajes de error para hacer esto en toda mi aplicación, ya que parece mucho más limpio tener un sistema de mensajes de error en lugar de dos.fuente
Resolví esto de manera similar a YoyoS, creando
app/helpers/devise_helper.rb
y colocando esto en él:¡Trabajó!
fuente
Solo quiero traer una pequeña pieza nueva aquí:
Así que encontré una manera más fácil de obtener el resultado que "AnApprentice" quería.
En primer lugar, si desea personalizar algo dentro del complemento Devise, le recomiendo que copie el código de "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | helpers | mailers ... "al archivo que desea en su proyecto.
[Editar] O puede hacer que su archivo herede de los archivos de diseño "normales" ... Como ... diga ... Desea sobrescribir solo una función dentro del dispositivo / registrations_controller.rb, la primera línea de sus Usuarios personalizados el controlador de registros sería:
[Editar 7 de agosto de 2013] Ahora, Devise incluso proporciona una herramienta para generar controladores: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Entonces ... de todos modos ... logré obtener lo que "AnApprentice" quería simplemente escribiendo esto (para una solución más limpia, vea la siguiente gran edición):
Y, en mi opinión, las siguientes líneas funcionaron bastante bien:
Bueno ... entonces puedes acceder a errores para un atributo específico como este:
Y ... Un pequeño truco para que solo aparezca un error (el primero en ser atrapado) por atributo:
Sé que ha pasado un tiempo desde que se publicó esta pregunta, pero creo que ayudará a muchos usuarios de diseño :).
Edición grande:
Como me encanta extender mi código, hacerlo más limpio y compartirlo con otros, ¡recientemente quise cambiar los devise_error_messages! para usarlo en mis vistas y hacer que muestre el truco que expliqué anteriormente.
Entonces, aquí está mi método:
No es gran cosa aquí, reutilicé el código que escribí en mi vista para mostrar solo un atributo de error de pey, porque a menudo el primero es el único relevante (como cuando el usuario olvida un campo obligatorio).
Estoy contando esos errores "únicos" y estoy haciendo un título HTML H2 usando pluralizar y poniéndolo ANTES de la lista de errores.
Así que ahora, puedo usar "devise_error_messages". como el predeterminado y muestra exactamente lo que ya estaba renderizando antes.
Si desea acceder a un mensaje de error específico en su vista, ahora le recomiendo usar directamente "resource.errors [: attribute] .first" o lo que sea.
Seya, Kulgar.
fuente
Estoy usando Devise en Rails 3 y su código flash es prácticamente idéntico al que tengo. En mi aplicación, el código funciona como se esperaba; es decir, se generan mensajes de error con el resto de mis mensajes flash:
Pruebe este código exacto y vea si hace alguna diferencia: los diferentes atributos de ID pueden ayudar.
fuente
Llegué a esto y está funcionando hasta ahora. Eso agrega mensajes de diseño al flash, por lo que puede usarse como de costumbre. Tenga en cuenta que soy nuevo en Ruby and Rails ...
Editar:
Lo siento, estaba haciendo guardia y había algún comportamiento no deseado. Como
after_filter
se llama después del renderizado, no funciona como se esperaba. Si alguien sabe cómo llamar a un método después de la acción pero antes de la representación ...Pero puedes usar algo así en su lugar:
En
views/shared/_messages.html.erb
fuente
Si desea poder mostrar más de un destello de un tipo determinado (: alerta,: aviso, etc.) y no perder el tiempo tratando de modificar el comportamiento de una gema, esta es la solución que utilicé con Devise. Estoy bastante seguro de que podría usarse con cualquier gema que use mensajes flash.
Lo primero que debe hacer, en su application_controller.rb, agregue esto:
Lo segundo que debe hacer, mostrar sus mensajes flash con esto en application.html.erb (o donde desee):
Tercero, cuando desee agregar un mensaje flash en cualquier controlador, haga lo siguiente:
fuente
Crear DeviseHelper:
En su opinión, sustituto
A:
fuente
Es cierto que es un poco hacky, pero estoy usando este ayudante (app / helpers / devise_helper.rb) para capturar flashes y usarlos si están configurados y luego predeterminados
resource.errors
. Esto se basa solo en el ayudante que está en el dispositivo lib.fuente
Si está buscando aprovechar devise_error_messages, puede hacerlo agregando resource.errors
Si tuviera que anular el controlador de registro, podría parecer
fuente
Manera muy fácil de mostrar mensajes de error para cada campo
coloque para cada campo con el nombre del campo entre corchetes debajo de cada línea donde desea mostrar el mensaje de error en línea.
fuente
Para mostrar su error de diseño desde su controlador con solo el primer error que aparece.
fuente
Solo para agregar a Eric Hu la respuesta anterior donde se usan todas las declaraciones If, en su lugar, haga algo como esto.
fuente
simplemente hago esto, funcionó para mí: en app / helpers / , creo un archivo devise_helper.rb
en todos los archivos de vista que cambio
para:
para mí hace que en mi vista edite y nuevo usuario:
Espero que te ayude ;)
fuente
<%= devise_error_messages! %>
y no responde la pregunta. La pregunta pregunta cómo aplicar flash a cada mensaje.fuente
Me gusta hacerlo tal como se hace en el otro controlador Devise con este truco.
fuente
Para que materialisecss muestre mensajes de error de dispositivo como tostadas, agregué este código en app / helpers / devise_helper.rb
Estoy seguro de que sería la forma más limpia de escribirlo, pero está funcionando perfectamente
fuente
DeviseHelper#devise_error_messages!
está en desuso y se eliminará en la próxima versión principal.Devise ahora usa un under parcial
devise/shared/error_messages
para mostrar mensajes de error por defecto y hacerlos más fáciles de personalizar. Actualice sus vistas cambiando llamadas desde:a:
fuente
Acabo de crear un me
app/helpers/devise_helper.rb
gusta John, pero anulé el método así:Con esto no tengo que modificar nada más. Es una mala idea ? Soy nuevo en los rieles, no dudes en corregirme. Gracias.
fuente
¡Acabo de declarar devise_error_messages! como un ayudante vacío Y obtuve y manejé manualmente los errores en un error general parcial para mi aplicación. Parecía la solución más simple y no tengo que revisar todos los archivos del dispositivo y eliminar la llamada al controlador de errores.
fuente