na mojej stronie edycji użytkownika znajduje się następująca linia:
<%= devise_error_messages! %>
Problem polega na tym, że to nie wyświetla błędów w standardowy sposób, w jaki robi to reszta aplikacji:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
Moje pytanie brzmi: jak sprawić, aby komunikat o błędzie urządzenia działał jak inne, które używają flash.each?
Dzięki.
ruby-on-rails
devise
Uczeń
źródło
źródło
Odpowiedzi:
Próbuję sam to rozgryźć. Właśnie znalazłem ten problem zalogowany na Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
Jose mówi, że
devise_error_messsages!
metoda jest tylko odgałęzieniem (chociaż zawiera implementację) i że powinniśmy ją przesłonić / zastąpić. Byłoby miło, gdyby zostało to zaznaczone gdzieś na wiki, dlatego myślę, że jest kilka osób takich jak my, które zgadywały.Dlatego spróbuję ponownie otworzyć moduł i przedefiniować metodę, skutecznie zastępując domyślną implementację. Dam ci znać, jak to idzie.
Aktualizacja
Tak, to działa. Stworzyłem
app/helpers/devise_helper.rb
i nadpisałem to tak:Wiedząc to, mogę zmodyfikować metodę, aby wyświetlać komunikaty o błędach tak, jak chcę.
Aby pomóc Ci rozwiązać pierwotny problem: Oto oryginał
devise_helper.rb
na Github . Zobacz, w jaki sposób przechodzą komunikaty o błędach:To powinno pomóc ci zacząć. :)
Kolejna aktualizacja
resource
Obiekt jest rzeczywiście model, który jest używany przez opracować (przejdź rysunek).Wydaje się również, że jest zdefiniowany w wyższym zakresie (prawdopodobnie pochodzi z kontrolera), więc można uzyskać do niego dostęp w różnych miejscach.
W dowolnym miejscu Twojego pomocnika
Twój widok
źródło
Poniższe rozwiązanie działa z najnowszym urządzeniem na chwilę obecną (4.1.1) i Railsami 4.2.6. Ale jest tak prosta, że nie widzę powodu, dla którego nie miałoby działać za 10 lat;)
Jeśli chcesz przetworzyć swoje komunikaty o błędach i sprawić, by wyglądały tak samo w całej aplikacji, poleciłbym coś takiego (sposób, którego nauczyłem się z Michaelem Hartlem):
Utwórz część dla komunikatów o błędach:
layouts/_error_messages.html.erb
Umieść w następującym kodzie (tutaj używam kilku klas bootstrap 3):Teraz masz coś, co można poddać recyklingowi i możesz tego używać na całej planszy. Zamiast standardowych rozwiązań:
Nazwij to w swoim formularzu w ten sposób:
Możesz umieścić to w dowolnej formie. Zamiast przekazywać zasób devise, możesz przekazać zmienną ze swojego formularza w następujący sposób:
źródło
Wiem, że minęło trochę czasu od opublikowania tego pytania, ale chciałem tylko skomentować to, co znalazłem. Dwie osoby, które już odpowiedziały, były dla mnie ogromną pomocą i po prostu chciałem wnieść swój wkład.
Zobaczysz w całym Devise, że są używane połączenia
render_with_scope
. Uważam, że jest to metoda zdefiniowana przez devise i zasadniczo stosuje bieżący zakres do następnego renderowanego widoku.Dlaczego jest to istotne? Devise zawiera twoje błędy w
resource.errors
( nie@resource.errors
). Devise działa dobrze, jeśli chcesz go używać po wyjęciu z pudełka, że tak powiem.Problemy z tymi błędami pojawiają się, gdy zaczniesz zmieniać sposób zarządzania użytkownikami. Dodając
redirect_to
lubrender
(zamiastrender_with_scope
) tam, gdzie Devise wcześniej go nie miał, po prostu wyrzucasz komunikaty o błędach. Moim zdaniem to sprawia, że Devise jest nieprzyjazny dla modyfikacji.Moje rozwiązanie jest takie
i
Ten ostatni blok kodu przyjmuje komunikaty o błędach Devise jako tablicę i dołącza je do
flash[:notice]
(jako tablica). Każda wiadomość będzie drukowana pojedynczo. Jeśli mam czas, myślę, że zmienię sposób, w jaki Devise obsługuje komunikaty o błędach, aby zrobić to w całej mojej aplikacji, ponieważ wydaje się znacznie czystsze mieć jeden system komunikatów o błędach zamiast dwóch.źródło
Rozwiązałem to podobnie jak YoyoS, tworząc
app/helpers/devise_helper.rb
i umieszczając w nim to:Pracowałem!
źródło
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:
[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ę):
Moim zdaniem następne wiersze działały całkiem nieźle:
Cóż ... wtedy możesz uzyskać dostęp do błędów dla określonego atrybutu, takiego jak ten:
I ... Mała sztuczka polegająca na wyświetlaniu tylko jednego błędu (pierwszego wyłapanego) dla każdego atrybutu:
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:
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.
źródło
Używam Devise w Rails 3 i twój kod flash jest prawie identyczny z tym, co mam. W mojej aplikacji kod działa zgodnie z oczekiwaniami; tzn. komunikaty o błędach Devise są wyprowadzane z resztą moich wiadomości flash:
Wypróbuj dokładnie ten kod i zobacz, czy to robi różnicę - może pomóc inny atrybut ID.
źródło
Podszedłem do tego i jak na razie działa. Dodaje to wiadomości do pamięci flash, dzięki czemu można go używać jak zwykle. Proszę wziąć pod uwagę, że jestem nowy w Ruby i Rails ...
Edytować:
Przepraszam, że biegałem na straży i pojawiło się jakieś niepożądane zachowanie. Ponieważ
after_filter
jest wywoływana po renderowaniu, więc nie działa zgodnie z oczekiwaniami. Jeśli ktoś wie, jak wywołać metodę po akcji, ale przed renderowaniem ...Ale zamiast tego możesz użyć czegoś takiego:
W
views/shared/_messages.html.erb
źródło
Jeśli chcesz mieć możliwość wyświetlania więcej niż jednego błysku danego typu (: alert,: notice, itp.) I nie tracić czasu na modyfikowanie zachowania klejnotów, to jest rozwiązanie, które zastosowałem w Devise. Jestem prawie pewien, że można go użyć z każdym klejnotem, który używa wiadomości flash.
Pierwszą rzeczą do zrobienia w pliku application_controller.rb jest dodanie tego:
Drugą rzeczą do zrobienia jest wyświetlenie wiadomości flash w pliku application.html.erb (lub gdziekolwiek chcesz):
Trzecia rzecz do zrobienia, gdy chcesz dodać wiadomość flash do dowolnego kontrolera, zrób to:
źródło
Utwórz DeviseHelper:
Twoim zdaniem zastąp
Do:
źródło
Trzeba przyznać, że trochę zepsuty, ale używam tego pomocnika (app / helpers / devise_helper.rb) do przechwytywania błysków i używania ich, jeśli są ustawione, a następnie domyślnie
resource.errors
. Jest to oparte na pomocniku, który znajduje się w devise lib.źródło
Jeśli chcesz się połączyć z devise_error_messages, możesz to zrobić, dodając do resource.errors
Gdybyś miał przejechać kontroler rejestracji, mogłoby to wyglądać
źródło
Bardzo łatwy sposób wyświetlania komunikatu o błędzie dla każdego pola
umieść dla każdego pola z nazwą pola w nawiasach kwadratowych poniżej każdego wiersza, w którym chcesz wyświetlić komunikat o błędzie.
źródło
Aby pokazać błąd urządzenia z kontrolera, z wyświetleniem tylko pierwszego błędu.
źródło
Aby dodać do powyższej odpowiedzi Erica Hu, w której są używane wszystkie stwierdzenia If, zrób raczej coś takiego.
źródło
po prostu to robię, pracował dla mnie: w app / helpers / , tworzę plik devise_helper.rb
we wszystkich plikach widoku, które zmieniam
dla:
u mnie to zrobić w moim widoku edycję i nowego użytkownika:
mam nadzieję, że ci to pomoże;)
źródło
<%= devise_error_messages! %>
i nie odpowiada na pytanie. Pytanie dotyczy tego, jak zastosować flash do każdej wiadomości.źródło
Lubię to robić tak, jak robi się to w innym kontrolerze Devise z tym kodem.
źródło
Aby materialisecss wyświetlał komunikaty o błędach devise jako toast, dodałem ten kod w app / helpers / devise_helper.rb
Jestem pewien, że to byłby najczystszy sposób, aby to napisać, ale jest doskonale
źródło
DeviseHelper#devise_error_messages!
jest przestarzały i zostanie usunięty w następnej głównej wersji.Devise używa teraz częściowego under,
devise/shared/error_messages
aby domyślnie wyświetlać komunikaty o błędach i ułatwić ich dostosowywanie. Zaktualizuj swoje widoki zmieniając połączenia z:do:
źródło
Właśnie stworzyłem
app/helpers/devise_helper.rb
podobnego Johna, ale zastąpiłem taką metodę:Dzięki temu nie muszę nic więcej modyfikować. Czy to zły pomysł? Jestem nowy w railach, nie wahaj się mnie poprawić. Dzięki.
źródło
Właśnie zadeklarowałem devise_error_messages! jako pusty pomocnik. I ręcznie pobrałem i obsłużono błędy w części ogólnej _errors dla mojej aplikacji. Wydawało się, że jest to najprostsze rozwiązanie i nie muszę przeglądać wszystkich plików devise i usuwać wywołania do obsługi błędów.
źródło