Voglio solo portare un nuovo piccolo pezzo qui:
Così ho trovato un modo più semplice per ottenere il risultato desiderato da "AnApprentice".
Prima di tutto, se vuoi personalizzare qualcosa all'interno del plug-in Devise, ti consiglio vivamente di copiare oltre il codice da "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controller | helpers | mailers ... "nel file desiderato nel progetto.
[Modifica] O puoi fare in modo che il tuo file erediti dai file "normali" escogita ... Come ... diciamo ... Vuoi sovrascrivere solo una funzione in devise / registrations_controller.rb, la prima riga dei tuoi utenti personalizzati il responsabile delle registrazioni sarebbe:
class Users::RegistrationsController < Devise::RegistrationsController
[Modifica 7 agosto 2013] Ora Devise fornisce anche uno strumento per generare controller: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Quindi ... comunque ... Sono riuscito a ottenere quello che "AnApprentice" voleva solo scrivere questo (per una soluzione più pulita, vedi la seguente modifica grande):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
E, a mio avviso, le righe successive hanno funzionato abbastanza bene:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Bene ... allora puoi accedere agli errori per un attributo specifico come questo:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
E ... Un piccolo trucco per avere un solo errore (il primo a essere scoperto) che compare per attributo:
<% 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 %>
So che è passato un po 'di tempo da quando questa domanda è stata pubblicata, ma penso che aiuterà molti utenti a concepire :).
Modifica grande:
Dato che adoro estendere il mio codice, renderlo più pulito e condividerlo con gli altri, recentemente ho voluto cambiare devise_error_messages! metodo per usarlo nelle mie viste e fargli visualizzare il trucco che ho spiegato sopra.
Quindi, ecco il mio metodo:
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
Non è un grosso problema qui, ho riutilizzato il codice che ho scritto a mio avviso per mostrare solo un attributo pey di errore, perché spesso il primo è l'unico rilevante (come quando l'utente dimentica un campo richiesto).
Sto contando quegli errori "unici" e sto facendo un titolo HTML H2 usando pluralize e mettendolo PRIMA dell'elenco degli errori.
Quindi ora posso usare "devise_error_messages!" come quello predefinito e rende esattamente quello che stavo già eseguendo il rendering prima.
Se si desidera accedere a un messaggio di errore specifico nella vista, ora consiglio di utilizzare direttamente "resource.errors [: attributo] .first" o altro.
Seya, Kulgar.