validates_confirmation_of i treść błędu

Witajcie,

Korzystam z validatora validates_confirmations_of dla pola :password, aby skorzystać z dobroci potwierdzenia wpisanego hasła. Domyślnie wszystkie validatory mają taki format komunikatu

:pole message
np.

password doesn’t match confirmation

Z angielskim jest wszystko fajnie, ale gorzej z polskim bo tłumaczenie: hasło nie pasuje do potwierdzenia ni jak mi nie pasuje. Czy da się jakoś złamać ten standard i tworzyć własne komunikaty z błędami. Dużo bardziej mi by pasowało “Wpisane hasła są różne”.

Korzystam z error_messages_on.

Bez plugina chyba się nie obejdzie:
l10n-simplified: http://agilewebdevelopment.com/plugins/localization_simplified, http://www.rubyonrails.pl/forum/viewtopic.php?pid=1708

Do tłumaczenia nazw pól w bazie:
http://agilewebdevelopment.com/plugins/human_attribute_override

Oba pluginy możesz zastąpić jednym, np Globalize, ale nie wiem czy to nie za dużo kobyła w tym momencie :).

Korzystam już z pluginu simple_localization. Nie chodzi mi o tłumaczenie na różne języki. Chodzi mi bardziej jak zmienić szablonowy komunikat z błędem

#{nazwa_pola} — #{komunikat z bledem}
haslo — jest za krotkie
haslo — powinno miec minimow 5 znakow
haslo — jest inne niz potwierdzenie hasla

A co jesli chce “Wpisane hasla sa rozne” tj. zlamac sztywny format komunikatu narzucony przez rails - na poczatku nazwa pola, pozniej opis bladu.

pole -> Person.password
konunikat z bledem -> validates_confirmation_of :password, :message => “To jest komunikat z bledem”

Wyswietli jesli validacja nie przejdzie “Password To jest komunikat z bledem”, a ja chce np. “To jest komunikat z bledem dla pola z haslem”.

Napisałem sobie dodatkowy moduł, który jest dołączany do ActiveRecord - pozwala na łatwą zamianę nazw poszczególnych pól na język polski.
Żeby rozwiązać problem odmiany (np. “jest pusty”, “jest pusta”) dodaje przed nazwą każdego pola "Wartość pola "…

Kiedy chce mieć komunikat, który nie dodaje tekstu “Wartość pola”, to w tłumaczeniu nazwy pola daję “^” na początku. Aby pozbyć się całej nazwy
pola po prostu używam samego “^”.

Szczegóły poniżej:

[code=ruby]#moduł

module Apohllo
module LocalErrors
def self.included(mod)
mod.extend(SingletonMethods)
end

module SingletonMethods
  def local_field_names(fields={})
    self.extend(ClassMethods)
    cattr_accessor :humanized_field_names
    self.humanized_field_names = fields
  end
end

module ClassMethods
  def human_attribute_name(attribute_key_name)
    name = self.humanized_field_names[attribute_key_name] || super
    if name !~ /\A\^/
      "Wartość pola " + name
    else
      name.sub /\A\^/, ""
    end
  end
end

end
end

rozszerzenie ActiveRecord

ActiveRecord::Base.send(:include, Apohllo::LocalErrors)

sposób użycia

class Person < ActiveRecord::Base
validates_acceptance_of :confirmed,
:message => “Musisz wyrazić zgodę na przetwarzanie danych osobowych”

local_field_names “confirmed” => “^”, “name” => “imię”, “surname” => “nazwisko”,
“email” => “e-mail”, “phone” => “telefon”, “street” => “ulica”,
“postal_code” => “kod pocztowy”, “city” => “miejscowość”
end[/code]
Jeśli w tym pluginie jest już metod typu local_fileds_names (lub jakiś jej odpowiednik) to możesz ją zmodyfikować w podobny sposób.

Po co pisać samemu jak jest już gotowe :slight_smile:

http://wiki.rubyonrails.org/rails/pages/Custom+Error+Message

Prosty plugin pozwalający ręcznie tworzyć całą zwracaną wiadomość.
Wystarczy dodać ‘^’ na początku wiadomosci

validates_presence_of :password, :message => '^Niezbędne jest podanie hasła'

Po to, żeby stworzyć lepsze :slight_smile:
Zwróć uwagę, że tamten plugin nie pozwala na zdefiniowanie własnych nazw pól. Poza tym język polski jest językiem fleksyjnym i jak chcemy mieć ładne komunikaty to większa elastyczność mojego rozwiązania jest zdecydowanie pożądana.
Korzystając z tamtego pluginu dla każdej walidacji (nie dla KAŻDEGO TYPU) musiałby zdefiniować własny komunikat.
Trochę zbyt WET IMHO :wink:

A tak mogę mieć komunikaty w stylu:
Wartość pola ‘abc’ jest… (domyślny)
Wartość pola ‘ulica’ jest (określenie nazwy pola)
Miasto nie znajduje się na liście (określenie nazwy pola “z daszkiem”)
Ten email jest niepoprawny, został wybrany przez innego użytkownika (określenie nazwy pola i treści komunikatu)