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:
class Users::RegistrationsController < Devise::RegistrationsController
[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):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
Y, en mi opinión, las siguientes líneas funcionaron bastante bien:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Bueno ... entonces puedes acceder a errores para un atributo específico como este:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
Y ... Un pequeño truco para que solo aparezca un error (el primero en ser atrapado) por atributo:
<% if resource.errors.any? %>
<% saved_key = "" %>
<% devise_error_messages!.each do |key, value| %>
<% if key != saved_key %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
<% saved_key = key %>
<% end %>
<% end %>
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:
def devise_error_messages!
html = ""
return html if resource.errors.empty?
errors_number = 0
html << "<ul class=\"#{resource_name}_errors_list\">"
saved_key = ""
resource.errors.each do |key, value|
if key != saved_key
html << "<li class=\"#{key} error\"> This #{key} #{value} </li>"
errors_number += 1
end
saved_key = key
end
unsolved_errors = pluralize(errors_number, "unsolved error")
html = "<h2 class=\"#{resource_name}_errors_title\"> You have #{unsolved_errors} </h2>" + html
html << "</ul>"
return html.html_safe
end
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.