32

Ich habe Attribute mit spezieller Validierung, wo ich die Message-Klausel verwenden, um eine spezielle Nachricht nur für diese Validierung anzuzeigen. Hier ist ein Beispiel:Ruby on Rails i18n - Benutzerdefinierte Nachrichten in Modellen

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

Ich möchte die Nachricht hier übersetzen, aber ich bin mir nicht sicher, wie es geht.

Ich habe Beispiele gesehen, wo sie etwas wie folgt eingeben: Nachricht: t ("some_value_here"). Ich bin mir nicht sicher über die Bezeichnung. Ich habe so etwas wie diese Nachricht versucht: t (: bad_email). Ich habe folgendes in meiner Yaml-Datei gemacht, nur um etwas zu versuchen.

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

Als ich versuchte, meine Rails-Anwendung zugreifen ich folgende Fehlermeldung bekommen:

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

Ich habe auch versucht, dies in meiner yaml Datei:

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

Ich habe dies aus erforscht und den ganzen Tag lang. Alles, was ich finden kann, ist, eingebaute Fehler-Hashes wie leer oder leer zu ersetzen. Gibt es eine Möglichkeit für mich, benutzerdefinierte Fehlerhashes zu haben und sie im Modell zu ersetzen? An diesem Punkt kann ich das t nicht als coded arbeiten lassen. Meine Hoffnung ist, dass das Problem ist, wie ich meine Yaml-Datei eingerichtet habe. Ich habe verschiedene Versionen gesehen, wie man das einrichten kann. Ich bin mir nicht sicher, ob ich dies unter activemodel oder activerecord setzen sollte. Ich nahm activemodel an, da das die benutzerdefinierte Nachricht ist, die ich übersetzen möchte.

Jede Hilfe wäre willkommen. Dies ist das letzte Stück, das ich herausfinden muss, bevor ich meine erste Übersetzung der Anwendung starte.

UPDATE 2013.07.29 07.30 CDT

bgates gab mir einen sehr guten Start mit, wie meine Modelldateien Setup die benutzerdefinierte Nachricht in der YAML-Datei zu erhalten. Allerdings musste ich in meiner Yaml-Datei die folgenden Einstellungen vornehmen, um die benutzerdefinierten Nachrichten zu finden.

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." 

Antwort

63

ein Symbol für die Nachricht verwenden:

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

dann in der YAML-Datei

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

Wenn es eine Übersetzung speziell für dieses Modell, wird es die allgemeinen ein außer Kraft setzen über:

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

Wenn Sie benutzerdefinierte Validierungen schreiben, führt add_error(:email, :bad_email) die obige Suche durch, aber errors[:email] << :bad_email wird nicht durchgeführt.

+0

ich meine Setup-Modell und yaml Dateien. Ich habe eine fehlende Übersetzung für activerecord.errors.models.user.attributes.email.bad_email erhalten. Ich gebe die Änderung, die ich in meiner Yaml-Datei gemacht habe, in meine Beschreibung ein. Es funktioniert gut. Vielen Dank für die Hilfe, die ich begonnen habe. –

+0

Ich musste 'activemodel' anstelle von 'activerecord' als meinen obersten Schlüssel verwenden. Weitere Details finden Sie in den Fehlern [Quelle] zu finden (https://github.com/rails/rails/blob/ccbc98e37dcc11ad5150b93dcee8008bc94aa83a/activemodel/lib/active_model/errors.rb#L465-L472). – Nick

+0

Netter Trick, danke –

20

Ich ging gerade durch all dies und fand die rails guides for custom validators zu hart codiert ... Ich bin dieses Posting hier, obwohl es nicht genau das, was Sie gefragt, aber die Q Titel passt perfekt (weshalb ich diesen Beitrag gelesen für mein Problem).

Angepasste Validierung mit i18n Nachricht:

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!"