Je veux juste apporter un nouveau petit morceau ici:
J'ai donc trouvé un moyen plus simple d'obtenir le résultat souhaité par "AnApprentice".
Tout d'abord, si vous souhaitez personnaliser quoi que ce soit dans le plug-in Devise, je vous conseille vivement de copier après le code de "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | helpers | mailers ... "dans le fichier souhaité dans votre projet.
[Modifier] Ou vous pouvez faire en sorte que votre fichier hérite des fichiers de devise "normaux" ... Comme ... disons ... Vous ne voulez écraser qu'une seule fonction dans le fichier devise / registrations_controller.rb, la première ligne de vos utilisateurs personnalisés le contrôleur des enregistrements serait:
class Users::RegistrationsController < Devise::RegistrationsController
[Edit 7 août 2013] Now Devise fournit même un outil pour générer des contrôleurs: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Alors ... de toute façon ... j'ai réussi à obtenir ce que "AnApprentice" voulait juste écrire ceci (pour une solution plus propre, voir la grande modification suivante):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
Et, à mon avis, les lignes suivantes ont plutôt bien fonctionné:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Eh bien ... alors vous pouvez accéder aux erreurs pour un attribut spécifique comme celui-ci:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
Et ... Une petite astuce pour n'avoir qu'une seule erreur (la première à être rattrapée) apparaissant par attribut:
<% 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 %>
Je sais que cela fait un moment que cette question a été publiée, mais je pense que cela aidera beaucoup d'utilisateurs de la conception :).
Grand montage:
Comme j'aime étendre mon code, le rendre plus propre et le partager avec les autres, j'ai récemment voulu changer les messages de devise_error_messages! afin de l'utiliser dans mes vues et de lui faire afficher l'astuce que j'ai expliquée ci-dessus.
Alors, voici ma méthode:
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
Ce n'est pas grave ici, j'ai réutilisé le code que j'ai écrit à mon avis pour n'afficher qu'un seul attribut d'erreur pey, car souvent le premier est le seul pertinent (comme lorsque l'utilisateur oublie un champ obligatoire).
Je compte ces erreurs "uniques" et je crée un titre HTML H2 en utilisant pluralize et en le mettant AVANT la liste des erreurs.
Alors maintenant, je peux utiliser les messages "devise_error_messages!" par défaut et il rend exactement ce que je rendais déjà avant.
Si vous voulez accéder à un message d'erreur spécifique dans votre vue, je recommande maintenant d'utiliser directement "resource.errors [: attribute] .first" ou autre.
Seya, Kulgar.