Auf meiner Benutzerbearbeitungsseite gibt es eine Zeile wie folgt:
<%= devise_error_messages! %>
Das Problem ist, dass dies keine Fehler ausgibt, wie es der Rest der App normalerweise tut:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
Meine Frage ist, wie kann ich erreichen, dass die Fehlermeldung des Geräts wie die anderen funktioniert, die flash.each verwenden?
Vielen Dank.
ruby-on-rails
devise
Ein Lehrling
quelle
quelle
Antworten:
Ich versuche das selbst herauszufinden. Ich habe dieses Problem gerade auf Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788 angemeldet gefunden
Jose sagt, dass die
devise_error_messsages!
Methode nur ein Stub ist (obwohl sie eine Implementierung enthält) und dass wir sie überschreiben / ersetzen sollen. Es wäre schön gewesen, wenn irgendwo im Wiki darauf hingewiesen worden wäre, weshalb ich denke, dass es einige Leute wie uns gibt, die geraten haben.Ich werde also versuchen, das Modul erneut zu öffnen und die Methode neu zu definieren, wobei die Standardimplementierung effektiv überschrieben wird. Ich werde dich wissen lassen, wie es geht.
Aktualisieren
Ja, das funktioniert. Ich
app/helpers/devise_helper.rb
habe es so erstellt und überschrieben:Wenn ich das weiß, kann ich die Methode so ändern, dass Fehlermeldungen so angezeigt werden, wie ich es möchte.
Um Ihnen bei der Lösung Ihres ursprünglichen Problems zu helfen: Hier ist das Original
devise_helper.rb
auf Github . Sehen Sie sich an, wie die Fehlermeldungen durchlaufen werden:Das sollte Ihnen den Einstieg erleichtern. :) :)
Ein weiteres Update
Das
resource
Objekt ist eigentlich das Modell, das von devise verwendet wird (siehe Abbildung).Es scheint auch in einem höheren Bereich definiert zu sein (wahrscheinlich vom Controller), so dass an verschiedenen Stellen darauf zugegriffen werden kann.
Überall in Ihrem Helfer
Deine Ansicht
quelle
Die folgende Lösung funktioniert mit dem neuesten Gerät (4.1.1) und Rails 4.2.6. Aber es ist so einfach, dass ich den Grund nicht sehe, warum es in 10 Jahren nicht funktionieren würde;)
Wenn Sie Ihre Fehlermeldungen recyceln möchten und sie in Ihrer App gleich aussehen lassen möchten, würde ich Folgendes empfehlen (wie ich es mit Michael Hartl gelernt habe):
Teilweise für Fehlermeldungen erstellen:
layouts/_error_messages.html.erb
Geben Sie folgenden Code ein (hier verwende ich einige Bootstrap 3-Klassen):Jetzt haben Sie etwas Recyclingfähiges und können es auf ganzer Linie verwenden. Anstelle von Standardgeräten:
Nennen Sie es in Ihrem Formular so:
Sie können es in jede Form bringen. Anstatt eine Ressourcenressource zu übergeben, können Sie eine Variable aus Ihrem Formular wie folgt übergeben:
quelle
Ich weiß, dass es eine Weile her ist, seit diese Frage gestellt wurde, aber ich wollte nur kommentieren, was ich gefunden habe. Die beiden Leute, die bereits geantwortet haben, waren eine enorme Hilfe für mich und ich wollte nur einen Beitrag leisten.
Sie werden in ganz Devise sehen, dass Anrufe verwendet werden
render_with_scope
. Ich glaube, dies ist eine von devise definierte Methode und wendet den aktuellen Bereich grundsätzlich auf die nächste gerenderte Ansicht an.Warum ist das relevant? Gerät enthält Ihre Fehler in
resource.errors
( nicht@resource.errors
). Das Gerät funktioniert einwandfrei, wenn Sie es sozusagen sofort verwenden möchten.Probleme mit diesen Fehlern treten auf, wenn Sie Ihr Benutzerverwaltungsverhalten ändern. Indem Sie ein
redirect_to
oderrender
(anstelle vonrender_with_scope
) hinzufügen, bei dem Devise zuvor kein hatte, werfen Sie im Grunde die Fehlermeldungen aus. Dies macht Devise meiner Meinung nach unfreundlich gegenüber Änderungen.Meine Lösung ist dies
und
Der letztere Codeblock nimmt die Fehlermeldungen von Devise als Array und hängt sie an
flash[:notice]
(als Array). Jede Nachricht wird zeilenweise ausgedruckt. Wenn ich Zeit habe, werde ich wahrscheinlich ändern, wie Devise mit Fehlermeldungen umgeht, um dies in meiner gesamten App zu tun, da es viel sauberer erscheint, ein Fehlermeldesystem anstelle von zwei zu haben.quelle
Ich habe dies ähnlich wie bei YoyoS gelöst, indem ich ein erstellt
app/helpers/devise_helper.rb
und darin platziert habe:Hat funktioniert!
quelle
Ich möchte nur ein neues kleines Stück hierher bringen:
Also habe ich einen einfacheren Weg gefunden, um das Ergebnis zu erzielen, das "AnApprentice" wollte.
Wenn Sie etwas innerhalb des Devise-Plug-Ins anpassen möchten, empfehle ich Ihnen dringend, den Code aus "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controller" zu kopieren | helpers | mailers ... "zu der Datei, die Sie in Ihrem Projekt haben möchten.
[Bearbeiten] Oder Sie können Ihre Datei von den "normalen" Gerätedateien erben lassen ... Wie ... sagen Sie ... Sie möchten nur eine Funktion in der Datei devise / registrations_controller.rb überschreiben, der ersten Zeile Ihrer benutzerdefinierten Benutzer Registrierungscontroller wäre:
[Bearbeiten 7. August 2013] Jetzt bietet Devise sogar ein Tool zum Generieren von Controllern: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Also ... jedenfalls ... habe ich es geschafft, das zu bekommen, was "AnApprentice" wollte, indem ich dies schrieb (für eine sauberere Lösung siehe die folgende große Bearbeitung):
Und meiner Meinung nach haben die nächsten Zeilen ziemlich gut funktioniert:
Nun ... dann können Sie auf Fehler für ein bestimmtes Attribut wie dieses zugreifen:
Und ... Ein kleiner Trick, bei dem nur ein Fehler (der erste, der abgefangen wird) pro Attribut angezeigt wird:
Ich weiß, dass es eine Weile her ist, seit diese Frage gestellt wurde, aber ich denke, dass sie vielen Entwicklern helfen wird :).
Big Edit:
Da ich es liebe, meinen Code zu erweitern, ihn sauberer zu machen und mit anderen zu teilen, wollte ich kürzlich die devise_error_messages ändern! Methode, um es in meinen Ansichten zu verwenden und den oben erläuterten Trick anzuzeigen.
Also, hier ist meine Methode:
Keine große Sache hier, ich habe den Code, den ich aus meiner Sicht geschrieben habe, wiederverwendet, um nur ein Fehler-Pey-Attribut anzuzeigen, da oft das erste das einzig relevante ist (wie wenn der Benutzer ein erforderliches Feld vergisst).
Ich zähle diese "eindeutigen" Fehler und erstelle mit pluralize einen H2-HTML-Titel und setze ihn VOR die Fehlerliste.
Jetzt kann ich die "devise_error_messages!" als Standard und es rendert genau das, was ich bereits zuvor gerendert habe.
Wenn Sie in Ihrer Ansicht auf eine bestimmte Fehlermeldung zugreifen möchten, empfehle ich jetzt, direkt "resource.errors [: attribute] .first" oder was auch immer zu verwenden.
Seya, Kulgar.
quelle
Ich verwende Devise in Rails 3 und Ihr Flash-Code ist ziemlich identisch mit dem, was ich habe. In meiner App funktioniert der Code wie erwartet. dh Gerätefehlermeldungen werden mit den restlichen Flash-Meldungen ausgegeben:
Probieren Sie genau diesen Code aus und prüfen Sie, ob er einen Unterschied macht - das unterschiedliche ID-Attribut kann hilfreich sein.
quelle
Ich bin darauf gekommen und es funktioniert soweit. Dadurch werden dem Flash Gerätemeldungen hinzugefügt, sodass er wie gewohnt verwendet werden kann. Bitte beachten Sie, dass ich neu bei Ruby and Rails bin ...
Bearbeiten:
Tut mir leid, dass ich Wache gehalten habe und ein unerwünschtes Verhalten vorhanden war. Da
after_filter
wird nach dem Rendern aufgerufen, so dass es nicht wie erwartet funktioniert. Wenn jemand weiß, wie man eine Methode nach der Aktion, aber vor dem Rendern aufruft ...Aber Sie können stattdessen so etwas verwenden:
Im
views/shared/_messages.html.erb
quelle
Wenn Sie mehr als einen Blitz eines bestimmten Typs anzeigen möchten (: alert ,: note, etc ...) und nicht Ihre Zeit damit verschwenden möchten, das Verhalten eines Edelsteins zu ändern, ist dies die Lösung, die ich mit Devise verwendet habe. Ich bin mir ziemlich sicher, dass es mit jedem Edelstein verwendet werden kann, der Flash-Nachrichten verwendet.
Fügen Sie als Erstes in Ihrer application_controller.rb Folgendes hinzu:
Zweitens müssen Sie Ihre Flash-Nachrichten damit in application.html.erb anzeigen (oder wo immer Sie möchten):
Als drittes sollten Sie Folgendes tun, wenn Sie in einem Controller eine Flash-Nachricht hinzufügen möchten:
quelle
Erstellen Sie DeviseHelper:
Aus Ihrer Sicht ersetzen
Zu:
quelle
Zugegeben, ein bisschen hackig, aber ich benutze diesen Helfer (app / helpers / devise_helper.rb), um Blitze zu greifen und diese zu verwenden, wenn sie auf Standard gesetzt sind
resource.errors
. Dies basiert nur auf dem Helfer, der in der Entwicklungsbibliothek enthalten ist.quelle
Wenn Sie devise_error_messages huckepack nehmen möchten, können Sie dies tun, indem Sie resource.errors hinzufügen
Wenn Sie den Registrierungscontroller außer Kraft setzen, könnte dies so aussehen
quelle
Sehr einfache Möglichkeit, Fehlermeldungen für jedes Feld anzuzeigen
Setzen Sie für jedes Feld den Feldnamen in eckige Klammern unter jede Zeile, in der Sie eine Inline-Fehlermeldung anzeigen möchten.
quelle
Anzeigen Ihres Gerätefehlers von Ihrem Controller, wobei nur der erste Fehler angezeigt wird.
quelle
Nur um Eric Hu Antwort oben hinzuzufügen, wo alle If-Anweisungen verwendet werden, machen Sie stattdessen lieber so etwas.
quelle
Ich mache das einfach, habe für mich gearbeitet: In App / Helpers / erstelle ich eine Datei devise_helper.rb
In allen Ansichtsdateien ändere ich
zum:
für mich macht es in meiner ansicht bearbeiten und neuer benutzer:
hoffe es wird dir helfen;)
quelle
<%= devise_error_messages! %>
und beantwortet die Frage nicht. In der Frage wird gefragt, wie Flash auf jede Nachricht angewendet werden soll.quelle
Ich mache es gerne so, wie es im anderen Devise-Controller mit diesem Cheat gemacht wird.
quelle
Damit materialisecss Fehlermeldungen als Toast anzeigt, habe ich diesen Code in app / helpers / devise_helper.rb hinzugefügt
Ich bin sicher, es wäre die sauberste Art, es zu schreiben, aber es wacht perfekt auf
quelle
DeviseHelper#devise_error_messages!
ist veraltet und wird in der nächsten Hauptversion entfernt.Devise verwendet jetzt ein Teil-Unter
devise/shared/error_messages
, um standardmäßig Fehlermeldungen anzuzeigen und deren Anpassung zu vereinfachen. Aktualisieren Sie Ihre Ansichten, indem Sie Anrufe ändern von:zu:
quelle
Ich habe gerade ein
app/helpers/devise_helper.rb
Like John erstellt, aber die Methode so überschrieben:Damit muss ich nichts anderes ändern. Ist es eine schlechte Idee? Ich bin neu in Schienen, zögern Sie nicht, mich zu korrigieren. Vielen Dank.
quelle
Ich habe gerade devise_error_messages deklariert! als leerer Helfer. Und manuell abgerufen und behandelt die Fehler in einem allgemeinen Fehler teilweise für meine Anwendung. Es schien die einfachste Lösung zu sein, und ich muss nicht alle Dateien des Geräts durchgehen und den Aufruf des Fehlerbehandlers entfernen.
quelle