Chcę tylko przynieść tutaj nowy mały kawałek:
Więc znalazłem łatwiejszy sposób na uzyskanie wyniku, którego chciał "AnApprentice".
Przede wszystkim, jeśli chcesz dostosować cokolwiek we wtyczce Devise, zdecydowanie radzę skopiować poza kod z "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers | helpers | mailers ... ”do pliku, który chcesz umieścić w projekcie.
[Edytuj] Lub możesz sprawić, by twój plik dziedziczył po "normalnych" plikach urządzenia ... Na przykład ... powiedz ... Chcesz nadpisać tylko jedną funkcję w devise / registrations_controller.rb, pierwszym wierszu niestandardowego użytkownika Administratorem rejestracji byłby:
class Users::RegistrationsController < Devise::RegistrationsController
[Edytuj 7 sierpnia 2013 r.] Now Devise udostępnia nawet narzędzie do generowania kontrolerów: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Więc ... w każdym razie ... udało mi się uzyskać to, czego chciał "AnApprentice", po prostu pisząc to (aby uzyskać czystsze rozwiązanie, zobacz następującą dużą edycję):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
Moim zdaniem następne wiersze działały całkiem nieźle:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Cóż ... wtedy możesz uzyskać dostęp do błędów dla określonego atrybutu, takiego jak ten:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
I ... Mała sztuczka polegająca na wyświetlaniu tylko jednego błędu (pierwszego wyłapanego) dla każdego atrybutu:
<% 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 %>
Wiem, że minęło trochę czasu od opublikowania tego pytania, ale myślę, że pomoże to wielu wymyślonym użytkownikom :).
Duża edycja:
Ponieważ uwielbiam rozszerzać swój kod, czynić go czystszym i dzielić się nim z innymi, ostatnio chciałem zmienić devise_error_messages! metody, aby użyć jej w moich widokach i wyświetlić sztuczkę, którą wyjaśniłem powyżej.
Oto moja metoda:
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
Nic wielkiego, ponownie wykorzystałem kod, który napisałem, aby pokazać tylko jeden atrybut błędu pey, ponieważ często pierwszy jest jedynym istotnym (np. Gdy użytkownik zapomina o jednym wymaganym polu).
Liczę te "unikalne" błędy i tworzę tytuł HTML dla H2 używając liczby mnogiej i umieszczam go PRZED listą błędów.
Więc teraz mogę użyć komunikatu „devise_error_messages!” jako domyślny i renderuje dokładnie to, co renderowałem wcześniej.
Jeśli chcesz uzyskać dostęp do konkretnego komunikatu o błędzie w swoim widoku, teraz zalecam bezpośrednie użycie „resource.errors [: atrybut] .first” lub cokolwiek innego.
Seya, Kulgar.