Używając Railsów, próbuję otrzymać komunikat o błędzie, taki jak „Pole utworu nie może być puste” podczas zapisywania. Wykonując następujące czynności:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
... wyświetla tylko „Song Rep XYW nie może być pusty”, co nie jest dobre, ponieważ tytuł pola nie jest przyjazny dla użytkownika. Jak mogę zmienić tytuł samego pola? Mógłbym zmienić rzeczywistą nazwę pola w bazie danych, ale mam wiele pól „utworu” i muszę mieć określone nazwy pól.
Nie chcę hakować procesu sprawdzania poprawności szyn i uważam, że powinien istnieć sposób, aby to naprawić.
źródło
errors.add :base, msg
? Chciałbym wiedzieć, o której kolumnie chodzi błąd, więc mogę wyświetlić go w odpowiednim polu formularza.The password is wrong.
LubThe email address is not valid.
zamiastPassword is wrong.
iEmail is not valid.
.W twoim modelu:
Twoim zdaniem
Jeśli to zrobisz
pojawia się ten komunikat o błędzie z nazwą atrybutu
jeśli chcesz otrzymać komunikat o błędzie dla jednego atrybutu
źródło
validates_presence_of :address1, :message => :put_some_address_please
Spróbuj tego.
Znalazłem to tutaj .
Oto inny sposób, aby to zrobić. To, co robisz, to zdefiniowanie metody human_attribute_name w klasie modelu. Metoda przekazuje nazwę kolumny jako ciąg znaków i zwraca ciąg znaków do użycia w komunikatach sprawdzania poprawności.
Powyższy kod pochodzi stąd
źródło
Tak, jest na to sposób bez wtyczki! Ale nie jest tak czysty i elegancki jak przy użyciu wspomnianej wtyczki. Oto jest.
Zakładając, że jest to Rails 3 (nie wiem, czy różni się w poprzednich wersjach),
zachowaj to w swoim modelu:
i w widoku, zamiast wychodzić
tak jak byłoby w przypadku generatora rusztowań, wstaw:
Otrzymasz tylko wiadomość określoną w modelu, bez nazwy atrybutu.
Wyjaśnienie:
Do tej pory wyświetlamy tylko jeden komunikat, zawsze dla pierwszego błędu. Jeśli chcesz wyświetlić wszystkie błędy, możesz zapętlić skrót i wyświetlić wartości.
Mam nadzieję, że to pomogło.
źródło
Kod Rails3 z całkowicie zlokalizowanymi wiadomościami:
W modelu user.rb zdefiniuj walidację
W config / locales / en.yml
źródło
W niestandardowej metodzie weryfikacji użyj:
errors.add(:base, "Custom error message")
ponieważ add_to_base zostało wycofane.
errors.add_to_base("Custom error message")
źródło
Związane z zaakceptowaną odpowiedzią i inną odpowiedzią na liście :
Potwierdzam, że rozwidlenie nanamkim custom-err-msg działa z Railsami 5 i ustawieniami regionalnymi.
Musisz tylko uruchomić wiadomość regionalną z karetką i nie powinna ona wyświetlać nazwy atrybutu w wiadomości.
Model zdefiniowany jako:
z następującymi
en.yml
:item.errors.full_messages
wyświetli się:zamiast zwykłego
Name You can't create an item without a name
źródło
Zalecam zainstalowanie klejnotu custom_error_message (lub wtyczki ) pierwotnie napisanego przez Davida Easleya
Pozwala ci robić takie rzeczy jak:
źródło
gem "custom_error_message"
do swojego Gemfile - zobacz github, aby uzyskać więcej informacjiJednym z rozwiązań może być zmiana domyślnego formatu błędu i18n:
Domyślnie jest
format: %{attribute} %{message}
źródło
Oto inny sposób:
Jeśli używasz tego szablonu:
Możesz napisać własną wiadomość w następujący sposób:
W ten sposób, z powodu podkreślenia, pełna wiadomość staje się „My custom message”, ale dodatkowa spacja na początku jest niezauważalna. Jeśli naprawdę nie chcesz tej dodatkowej przestrzeni na początku, po prostu dodaj
.lstrip
metodę.Metoda String.lstrip pozbywa się dodatkowej przestrzeni utworzonej przez „: _” i pozostawia inne komunikaty o błędach bez zmian.
Lub jeszcze lepiej, użyj pierwszego słowa niestandardowej wiadomości jako klucza:
Teraz pełna wiadomość będzie „Moja niestandardowa wiadomość” bez dodatkowego miejsca.
Jeśli chcesz, aby cała wiadomość zaczynała się od wielkiej litery, takiej jak „URL nie może być pusty”, nie można tego zrobić. Zamiast tego spróbuj dodać inne słowo jako klucz:
Teraz pełna wiadomość będzie „URL nie może być pusty”
źródło
errors.add(:_, 'foobar')
i dostać „foobar” jako wiadomośćPo prostu zrób to normalnie:
Zamiast tego wyświetl to w ten sposób
Zwroty
Metoda lokalizacji jest zdecydowanie „właściwym” sposobem na zrobienie tego, ale jeśli wykonujesz mały, nieglobalny projekt i chcesz po prostu szybko zacząć - jest to zdecydowanie łatwiejsze niż przeskakiwanie plików.
Podoba mi się to ze względu na możliwość umieszczenia nazwy pola w innym miejscu niż początek ciągu:
źródło
Jeśli chcesz umieścić je wszystkie na ładnej liście, ale bez użycia grubej, nie przyjaznej dla człowieka nazwy, możesz to zrobić ...
źródło
Twoim zdaniem
Jeśli chcesz przesłonić komunikat o błędzie bez nazwy atrybutu, po prostu wstaw wiadomość z ^ tak:
źródło
Próbowałem śledzić, pracował dla mnie :)
1 praca. Rb
2 jobs_controller.rb
3 _form.html.erb
źródło
Oto mój kod, który może ci się przydać na wypadek, gdybyś go nadal potrzebował: Mój model:
Następnie stworzyłem pomocnika do wyświetlania wiadomości:
źródło
Jedynym sposobem, w jaki mogłem uzyskać wszystkie potrzebne dostosowania, było użycie
after_validation
wywołania zwrotnego, aby umożliwić mi manipulowanie komunikatem o błędzie.Pozwól, aby komunikat sprawdzania poprawności był tworzony normalnie, nie musisz próbować go zmieniać w pomocniku sprawdzania poprawności.
utwórz
after_validation
wywołanie zwrotne, które zastąpi ten komunikat sprawdzania poprawności w back-endie, zanim przejdzie do widoku.W
after_validation
metodzie możesz zrobić wszystko, co chcesz z komunikatem sprawdzania poprawności, podobnie jak normalny ciąg! Możesz nawet użyć wartości dynamicznych i wstawić je do komunikatu sprawdzania poprawności.Metoda after_validation będzie miała znacznie większy zasięg niż wbudowany pomocnik sprawdzania poprawności szyn, więc będziesz mógł uzyskać dostęp do sprawdzanego obiektu, tak jak próbujesz zrobić z object.file_name. Który nie działa w pomocniku sprawdzania poprawności, w którym próbujesz to nazwać.
Uwaga: używamy,
^
aby pozbyć się nazwy atrybutu na początku sprawdzania poprawności, ponieważ @Rystraum wskazał na odwołanie do tego klejnotuźródło
Odpowiedź graywh jest najlepsza, jeśli w rzeczywistości wyświetla się inaczej w wyświetlaniu nazwy pola. W przypadku dynamicznej nazwy pola (na podstawie innych wyświetlanych pól) zrobiłbym coś takiego
metoda full_message w innym przypadku jest używana przez szyny w metodzie full_messages, więc wyśle normalne błędy Rails dla innych przypadków (Rails 3.2 i nowsze)
źródło