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:
class Users::RegistrationsController < Devise::RegistrationsController
[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):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
Und meiner Meinung nach haben die nächsten Zeilen ziemlich gut funktioniert:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Nun ... dann können Sie auf Fehler für ein bestimmtes Attribut wie dieses zugreifen:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
Und ... Ein kleiner Trick, bei dem nur ein Fehler (der erste, der abgefangen wird) pro Attribut angezeigt wird:
<% 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 %>
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:
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
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.