Eu só quero trazer um novo pedacinho aqui:
Então, achei uma maneira mais fácil de obter o resultado que "AnApprentice" queria.
Antes de tudo, se você deseja personalizar qualquer coisa no plug-in Devise, recomendo que você copie o código de "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | helpers | mailers ... "para o arquivo que você deseja em seu projeto.
[Editar] Ou você pode herdar seu arquivo dos arquivos de criação "normais" ... Como ... digamos ... Você deseja substituir apenas uma função dentro de devise / registrations_controller.rb, a primeira linha do seu costume de Usuários controlador de registros seria:
class Users::RegistrationsController < Devise::RegistrationsController
Agora, o Devise fornece uma ferramenta para gerar controladores: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Então ... enfim ... consegui obter o que "AnApprentice" queria escrever apenas isso (para uma solução mais limpa, veja a grande edição a seguir):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
E, na minha opinião, as próximas linhas funcionaram muito bem:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Bem ... então você pode acessar os erros de um atributo específico como este:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
E ... Um pequeno truque para exibir apenas um erro (o primeiro a ser capturado) por atributo:
<% 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 %>
Eu sei que já faz um tempo desde que essa pergunta foi publicada, mas acho que isso ajudará muitos usuários inventores :).
Grande edição:
Como adoro estender meu código, tornando-o mais limpo e compartilhá-lo com outras pessoas, recentemente desejei alterar as devise_error_messages! para usá-lo em meus pontos de vista e mostrar o truque que expliquei acima.
Então, aqui está o meu método:
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
Não é grande coisa aqui, reutilizei o código que escrevi na minha exibição para mostrar apenas um atributo pey de erro, porque geralmente o primeiro é o único relevante (como quando o usuário esquece um campo obrigatório).
Estou contando esses erros "únicos" e estou criando um título HTML H2 usando o pluralize e colocando-o ANTES da lista de erros.
Então agora eu posso usar o "devise_error_messages!" como o padrão e renderiza exatamente o que eu já estava renderizando antes.
Se você deseja acessar uma mensagem de erro específica em sua exibição, agora recomendo usar diretamente "resource.errors [: attribute] .first" ou qualquer outra coisa.
Seya, Kulgar.