it-swarm.com.de

Ruby on Rails i18n - Benutzerdefinierte Meldungen in Modellen übersetzen möchten

Ich habe Attribute mit besonderer Validierung, bei denen ich die Nachrichtenklausel verwende, um eine spezielle Nachricht nur für diese Validierung anzuzeigen. Hier ist ein Beispiel:

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 gerne hier übersetzen, bin mir aber nicht sicher, wie ich das tun soll.

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

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

Beim Versuch, auf meine Rails-Anwendung zuzugreifen, wurde die folgende Fehlermeldung angezeigt:

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

Ich habe dies auch in meiner yaml-Datei versucht:

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

Ich habe den ganzen Tag über recherchiert. Alles, was ich finden kann, ist, eingebaute Fehlerhashes wie leer oder leer zu ersetzen. Gibt es eine Möglichkeit, benutzerdefinierte Fehlerhashes zu erstellen und diese im Modell zu ersetzen? Zu diesem Zeitpunkt kann ich das t nicht wie verschlüsselt arbeiten lassen. Ich hoffe, das Problem ist, wie ich meine Yaml-Datei eingerichtet habe. Ich habe verschiedene Versionen des Setups gesehen. Ich bin mir nicht sicher, ob ich dies unter Activemodel oder Activerecord setzen sollte. Ich habe angenommen, dass es sich bei Activemodel um die benutzerdefinierte Nachricht handelt, die ich übersetzen möchte.

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

UPDATE 29.07.2013 19:30 Uhr CDT

bgates gab mir einen sehr guten Start mit dem Einrichten meiner Modelldateien, um die benutzerdefinierte Nachricht in der YAML-Datei zu erhalten. Allerdings musste ich in meiner yaml-Datei die folgenden Einstellungen vornehmen, damit die benutzerdefinierten Nachrichten gefunden werden konnten.

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

Verwenden Sie ein Symbol für die Nachricht:

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 gibt, die für dieses Modell spezifisch ist, wird die allgemeine oben überschrieben:

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

Wenn Sie benutzerdefinierte Überprüfungen schreiben, führt add_error(:email, :bad_email) die obige Suche durch, errors[:email] << :bad_email jedoch nicht.

68
bgates

Ich ging gerade durch das alles und fand die Rails-Anleitungen für benutzerdefinierte Validatoren zu hartcodiert ... Ich poste dies hier, obwohl es nicht genau das ist, was Sie gefragt haben, aber der Q-Titel passt perfekt (weshalb Ich habe diesen Beitrag für mein Problem gelesen.

Benutzerdefinierte Validierung mit der 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!"
21
oma

Die Lösung dafür muss nicht benutzerdefiniert sein; Die format-Validatornachricht ist bereits dem :invalid-Symbol zugeordnet. Sie müssen nur das Ungültige in der Übersetzung setzen.

en:
  activerecord:
    errors:
      models:
        some_model:
          attributes:
            email:
              invalid: "FOO"

Referenz: http://edgeguides.rubyonrails.org/i18n.html#error-message-interpolation

2
BookOfGreg

Ich werde ein vollständiges Beispiel geben.

Um Ihre Modelle sauberer zu machen, erstellen Sie can _ eine benutzerdefinierte Validierungshilfemethode in einem völlig neuen Verzeichnis - app/validations -, das von Rails automatisch geladen wird.

Ich werde meine Datei time_validator.rb anrufen, die sich unter app/validations/time_validator.rb befindet.

Meine Datei enthält den folgenden Code, der die vom Benutzer eingegebene Zeit überprüft - dh es ist tatsächlich -Zeit.

# frozen_string_literal: true

class TimeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    Time.parse(value).strftime('%H:%M')
  rescue ArgumentError 
    record.errors.add(attribute, :invalid_time)
  end
end

Weitere Informationen zum Erstellen benutzerdefinierter ActiveRecord-Überprüfungen finden Sie hier .

Unser Hauptanliegen ist die record.errors-Zeile. Beachten Sie, dass es attribute und nicht :attribute ist, wobei attribute die Spalte in Ihrem Modell ist.

:invalid_time ist der Schlüssel, mit dem der übersetzte Inhalt aus der Datei "locales" abgerufen wird. In meinem Fall ist dies die en-Datei:

en
  activerecord:
    errors:
      models:
        home:
          attributes:
            check_in_time:
              invalid_time: Please enter valid time
            check_out_time:
              invalid_time: Please enter valid time

Dann im Modell home:

validates :check_in_time, time: { allow_blank: true }
validates :check_out_time, time: { allow_blank: true }

time wird automatisch der Klasse TimeValidator zugeordnet, und die darin enthaltenen Methoden werden ausgeführt.

Wenn dies verletzt wird, gibt ActiveRecord einen Fehler direkt unter dem Spaltennamen aus.

Hoffe das hilft!

0
Ruto Collins