32

Mam atrybuty ze specjalnym sprawdzaniem poprawności, gdzie używam klauzuli message, aby wyświetlić specjalną wiadomość tylko dla tej walidacji. Oto jeden przykład:Ruby on Rails i18n - Chcesz przetłumaczyć niestandardowe komunikaty w modelach

validates :email, presence: true, length: { maximum: 60 }, 
       format:  { with: valid_email_regex, message: "is not a valid email address format." }, 
       uniqueness: { case_sensitive: false } 

Chciałbym przetłumaczyć wiadomość tutaj, ale nie jestem pewien, jak to zrobić.

Widziałem przykłady, w których wpisują coś takiego: message: t ("some_value_here"). Nie jestem pewien co do nazwy. Próbowałem coś takiego: t (: bad_email). Zrobiłem następujące rzeczy w moim pliku yaml, żeby spróbować czegoś.

activemodel: 
    errors: 
    bad_email: "is not a valid email address format." 

Kiedy próbował uzyskać dostęp do mojej aplikacji Rails mam następujący błąd:

ActionView::Template::Error (undefined method `t' for #<Class:0x007fefc1b709e0>) 

Próbowałem to także w moim pliku YAML:

activemodel: 
    errors: 
    user: 
     bad_email: "is not a valid email address format." 

I zostały badania tego off i przez cały dzień. Wszystko, co mogę znaleźć, to zastąpienie wbudowanych błędów, takich jak puste lub puste. Czy istnieje sposób, aby mieć niestandardowe skróty błędów i zastąpić je w modelu? W tym momencie nie mogę działać tak, jak zakodowałem. Mam nadzieję, że problem polega na tym, jak mam ustawiony mój plik yaml. Widziałem różne wersje tego, jak to ustawić. Nie jestem pewien, czy powinienem umieścić to pod activemodel lub activerecord. Zakładałem activemodel, ponieważ jest to miejsce, w którym niestandardowa wiadomość jest taka, że ​​chcę ją przetłumaczyć.

Każda pomoc zostanie doceniona. To ostatni fragment, który muszę opracować przed uruchomieniem mojego pierwszego tłumaczenia aplikacji.

UPDATE 29.07.2013 19:30 CDT

bgates dał mi bardzo dobry początek, jak skonfigurować moje pliki modelowe otrzymywać komunikat niestandardowy w pliku YAML. Jednak musiałem wykonać następujące ustawienia w moim pliku yaml, aby znaleźć niestandardowe wiadomości.

activerecord: 
    errors: 
    models: 
     user: 
     attributes: 
      bio: 
      no_links: "cannot contain email addresses or website links (URLs)." 
      email: 
      bad_email: "is not a valid email address format." 
      username: 
      bad_username: "can only contain numbers and letters. No special characters or spaces." 

Odpowiedz

63

użyć symbolu do wiadomości:

validates :email, presence: true, length: { maximum: 60 }, 
      format:  { with: valid_email_regex, message: :bad_email }, 
      uniqueness: { case_sensitive: false } 

następnie w pliku YAML

[lang]: 
    activerecord: 
    errors: 
     messages: 
     bad_email: "just ain't right" 

Jeśli istnieje tłumaczenie specyficzne dla tego modelu, zastąpi on ogólną jednego powyżej:

[lang]: 
    activerecord: 
    errors: 
     models: 
     model_name: # or namespace/model_name 
      attributes: 
      email: 
       bad_email: "model-specific message for invalid email" 

Jeśli napiszesz niestandardowe sprawdzanie poprawności, add_error(:email, :bad_email) wykona powyższe odnośniki, ale errors[:email] << :bad_email nie będzie.

+0

mogę skonfigurować mojego modelu i YAML plików. Mam brakujące tłumaczenie dla pliku activerecord.errors.models.user.attributes.email.bad_email. Wprowadziłem zmianę, którą wprowadziłem w moim pliku yaml w moim opisie. Działa dobrze. DZIĘKI TAKIEGO DUŻEGO, ABY POMÓC MNIE ROZPOCZĄĆ. –

+0

Musiałem użyć 'activemodel' zamiast' activerecord' jako mojego klucza najwyższego poziomu. Więcej szczegółów można znaleźć w Błędy [źródło] (https://github.com/rails/rails/blob/ccbc98e37dcc11ad5150b93dcee8008bc94aa83a/activemodel/lib/active_model/errors.rb#L465-L472). – Nick

+0

Dobra sztuczka, dziękuję –

20

Właśnie przeszedłem przez to wszystko i znalazłem rails guides for custom validators zbyt mocno zakodowane ... Zamieszczam tutaj, mimo że nie jest to dokładnie to, o co prosiłeś, ale tytuł Q pasuje idealnie (dlatego czytam ten post dla mojego problemu).

klienta walidacji z komunikatem i18n:

validate :something_custom?, if: :some_trigger_condition 

def something_custom? 
    if some_error_condition 
    errors.add(:some_field_key, :some_custom_msg) 
    end 
end 

# en.yml 
activerecord: 
    errors: 
    models: 
     some_model: 
     some_custom_msg: "This is i18n controlled. yay!"