dans ma page d'édition utilisateur, il y a une ligne comme suit:
<%= devise_error_messages! %>
Le problème est que cela ne génère pas d'erreurs comme le fait le reste de l'application:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
Ma question est la suivante: comment faire pour que le message d'erreur du périphérique fonctionne comme les autres utilisateurs de flash.each?
Merci.
ruby-on-rails
devise
Un apprenti
la source
la source
Réponses:
J'essaye de comprendre cela moi-même. Je viens de trouver ce problème connecté sur Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
Jose dit que cette
devise_error_messsages!
méthode n'est qu'un stub (bien qu'elle contienne une implémentation) et que nous sommes censés la remplacer / la remplacer. Cela aurait été bien si cela avait été signalé quelque part dans le wiki, c'est pourquoi je suppose qu'il y a quelques personnes comme nous qui ont deviné.Je vais donc essayer de rouvrir le module et de redéfinir la méthode, en remplaçant efficacement l'implémentation par défaut. Je vous ferai savoir comment ça se passe.
Mettre à jour
Oui, ça marche. Je l'ai créé
app/helpers/devise_helper.rb
et écrasé comme ceci:Sachant cela, je peux modifier la méthode pour afficher les messages d'erreur comme je le souhaite.
Pour vous aider à résoudre votre problème d'origine: voici l'original
devise_helper.rb
sur Github . Jetez un œil à la façon dont les messages d'erreur sont parcourus:Cela devrait vous aider à démarrer. :)
Une autre mise à jour
L'
resource
objet est en fait le modèle utilisé par le dispositif (voir la figure).Il semble également être défini dans une portée plus élevée (provenant probablement du contrôleur), de sorte qu'il peut être consulté dans une variété d'endroits.
N'importe où dans votre assistant
Ta vue
la source
La solution ci-dessous fonctionne avec le dernier modèle à partir de maintenant (4.1.1) et Rails 4.2.6. Mais c'est si simple que je ne vois pas la raison pour laquelle cela ne fonctionnerait pas dans 10 ans;)
Si vous souhaitez recycler vos messages d'erreur et leur donner la même apparence dans votre application, je recommanderais quelque chose comme ceci (comme j'ai appris avec Michael Hartl tut):
Créer partiel pour les messages d'erreur:
layouts/_error_messages.html.erb
Mettez à l'intérieur du code suivant (ici, j'utilise des classes bootstrap 3):Maintenant, vous avez quelque chose de recyclable et vous pouvez l'utiliser partout. Au lieu d'un appareil standard:
Appelez-le dans votre formulaire comme ceci:
Vous pouvez le mettre sous n'importe quelle forme. Au lieu de passer la ressource de conception, vous pouvez passer la variable de votre formulaire comme ceci:
la source
Je sais que cela fait un moment que cette question a été publiée, mais je voulais juste commenter ce que j'ai trouvé. Les deux personnes qui ont déjà répondu m'ont été d'une aide précieuse et je voulais juste contribuer.
Vous verrez tout au long de Devise que des appels utilisent
render_with_scope
. Je crois que c'est une méthode définie par devise et applique essentiellement la portée actuelle à la vue suivante rendue.Pourquoi est-ce pertinent? Devise contient vos erreurs dans
resource.errors
( pas@resource.errors
). Devise fonctionne bien si vous souhaitez l'utiliser hors de la boîte, pour ainsi dire.Des problèmes avec ces erreurs surviennent si vous commencez à modifier votre comportement de gestion des utilisateurs. En ajoutant un
redirect_to
ourender
(au lieu derender_with_scope
) là où Devise n'en avait pas auparavant, vous jetez essentiellement les messages d'erreur. Cela rend Devise hostile à la modification, à mon avis.Ma solution est la suivante
et
Le dernier bloc de code prend les messages d'erreur de Devise sous forme de tableau et les ajoute
flash[:notice]
(sous forme de tableau). Chaque message sera imprimé une ligne à la fois. Si j'ai le temps, je pense que je vais changer la façon dont Devise gère les messages d'erreur pour le faire dans mon application, car il semble beaucoup plus propre d'avoir un système de messages d'erreur au lieu de deux.la source
J'ai résolu cela de la même manière que YoyoS, en créant un
app/helpers/devise_helper.rb
et en le plaçant dedans:Travaillé!
la source
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:
[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):
Et, à mon avis, les lignes suivantes ont plutôt bien fonctionné:
Eh bien ... alors vous pouvez accéder aux erreurs pour un attribut spécifique comme celui-ci:
Et ... Une petite astuce pour n'avoir qu'une seule erreur (la première à être rattrapée) apparaissant par attribut:
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:
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.
la source
J'utilise Devise dans Rails 3 et votre code flash est à peu près identique à ce que j'ai. Dans mon application, le code fonctionne comme prévu; c'est-à-dire que les messages d'erreur de Devise sont émis avec le reste de mes messages flash:
Essayez ce code exact et voyez s'il fait une différence - l'attribut ID différent peut vous aider.
la source
J'en suis venu à cela et cela fonctionne jusqu'à présent. Cela ajoute des messages de conception au flash, de sorte qu'il peut être utilisé comme d'habitude. Veuillez considérer que je suis nouveau dans Ruby and Rails ...
Éditer:
Désolé, je faisais la garde et un comportement indésirable était présent. Depuis
after_filter
est appelé après le rendu, il ne fonctionne donc pas comme prévu. Si quelqu'un sait appeler une méthode après l'action mais avant le rendu ...Mais vous pouvez utiliser quelque chose comme ça à la place:
Dans
views/shared/_messages.html.erb
la source
Si vous voulez pouvoir afficher plus d'un flash d'un type donné (: alert,: notice, etc ...) et ne pas perdre votre temps à essayer de modifier le comportement d'un gem, c'est la solution que j'ai utilisée avec Devise. Je suis presque sûr qu'il pourrait être utilisé avec n'importe quelle gemme qui utilise des messages flash.
Première chose à faire, dans votre application_controller.rb, ajoutez ceci:
Deuxième chose à faire, afficher vos messages flash avec ceci dans application.html.erb (ou où vous voulez):
Troisième chose à faire, chaque fois que vous souhaitez ajouter un message flash dans n'importe quel contrôleur, procédez comme suit:
la source
Créez DeviseHelper:
À votre avis, remplacez
À:
la source
Certes, un peu piraté, mais j'utilise cet assistant (app / helpers / devise_helper.rb) pour récupérer les flashs et les utiliser s'ils sont définis par défaut
resource.errors
. Ceci est juste basé sur l'aide qui se trouve dans la librairie de conception.la source
Si vous cherchez à tirer parti de devise_error_messages, vous pouvez le faire en ajoutant à resource.errors
Si vous deviez dépasser le contrôleur d'enregistrement, cela pourrait ressembler à
la source
Moyen très simple d'afficher un message d'erreur pour chaque champ
mettez pour chaque champ avec le nom de champ entre crochets sous chaque ligne où vous voulez afficher un message d'erreur en ligne.
la source
Pour afficher l'erreur de votre appareil à partir de votre contrôleur avec seulement la première erreur à apparaître.
la source
Juste pour ajouter à la réponse d'Eric Hu ci-dessus où toutes les instructions If sont utilisées, faites plutôt quelque chose comme ça à la place.
la source
je fais simplement cela, a fonctionné pour moi: dans app / helpers / , je crée un fichier devise_helper.rb
dans tous les fichiers de vue que je change
pour:
pour moi, il fait à mon avis modifier et nouvel utilisateur:
j'espère que cela vous aidera;)
la source
<%= devise_error_messages! %>
et ne répond pas à la question. La question demande comment appliquer le flash à chaque message.la source
J'aime le faire comme dans l'autre contrôleur Devise avec cette astuce.
la source
Pour que materialisecss affiche les messages d'erreur de conception sous forme de toast, j'ai ajouté ce code dans app / helpers / devise_helper.rb
Je suis sûr que ce serait la façon la plus propre de l'écrire mais ça se réveille parfaitement
la source
DeviseHelper#devise_error_messages!
est obsolète et sera supprimé dans la prochaine version majeure.Devise utilise désormais un sous partiel
devise/shared/error_messages
pour afficher les messages d'erreur par défaut et les rendre plus faciles à personnaliser. Mettez à jour vos vues en modifiant les appels de:à:
la source
Je viens de créer un
app/helpers/devise_helper.rb
comme John mais j'ai remplacé la méthode comme ça:Avec cela, je n'ai rien d'autre à modifier. Est-ce une mauvaise idée? Je suis nouveau sur les rails, n'hésitez pas à me corriger. Merci.
la source
Je viens de déclarer devise_error_messages! comme une aide vide. Et manuellement récupéré et géré les erreurs dans un _errors partiel général pour mon application. Cela semblait être la solution la plus simple et je n'ai pas besoin de parcourir tous les fichiers de l'appareil et de supprimer l'appel au gestionnaire d'erreurs.
la source