32

Ho attributi con convalida speciale dove uso la clausola del messaggio per visualizzare un messaggio speciale solo per quella convalida. Ecco un esempio:Ruby on Rails i18n - Desidera tradurre messaggi personalizzati nei modelli

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

Vorrei tradurre il messaggio qui ma non sono sicuro di come farlo.

Ho visto esempi in cui scrivono qualcosa di simile a questo: message: t ("some_value_here"). Non sono sicuro della designazione. Ho provato qualcosa di simile a questo messaggio: t (: bad_email). Ho fatto quanto segue nel mio file yaml solo per provare qualcosa.

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

Quando ho provato ad accedere alla mia applicazione Rails ho ottenuto il seguente errore:

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

Ho provato anche questo nel mio file YAML:

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

Sto ricercando questo off e per tutto il giorno. Tutto quello che posso trovare è di sostituire gli errori di errore incorporati come vuoto o vuoto. C'è un modo per me di avere degli errori di errore personalizzati e sostituirli nel modello? A questo punto non riesco a far funzionare il t come codificato. La mia speranza è che il problema sia come ho impostato il mio file yaml. Ho visto diverse versioni di come impostare questo. Non sono sicuro se dovrei metterlo sotto activemodel o activerecord. Ho assunto attivemodel poiché è qui che il messaggio personalizzato è quello che voglio tradurre.

Qualsiasi aiuto sarebbe apprezzato. Questo è l'ultimo pezzo che ho bisogno di capire prima di lanciare la mia prima traduzione dell'applicazione.

UPDATE 2013/07/29 19:30 CDT

bgates mi ha dato un buon inizio con il modo di impostare il mio file di modello per ricevere il messaggio personalizzato nel file YAML. Tuttavia ho finito per dover eseguire la seguente configurazione nel mio file yaml per trovare i messaggi personalizzati.

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

risposta

63

Utilizzare un simbolo per il messaggio:

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

poi nel file YAML

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

Se c'è una traduzione specifica per questo modello, si avrà la precedenza su quella generale di cui sopra:

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

Se si scrivono convalide personalizzate, lo standard add_error(:email, :bad_email) eseguirà la ricerca sopra, ma non lo sarà errors[:email] << :bad_email.

+0

impostare il mio modello e YAML. Ho ricevuto una traduzione mancante per activerecord.errors.models.user.attributes.email.bad_email. Ho inserito la modifica che ho apportato nel mio file yaml nella mia descrizione. Funziona bene. GRAZIE TANTO PER AIUTARMI INIZIAMO. –

+0

Ho dovuto usare 'activemodel' invece di' activerecord' come chiave di primo livello. Maggiori dettagli sono disponibili in Errori [fonte] (https://github.com/rails/rails/blob/ccbc98e37dcc11ad5150b93dcee8008bc94aa83a/activemodel/lib/active_model/errors.rb#L465-L472). – Nick

+0

Bel trucco, grazie –

20

Ho appena attraversato tutto questo e ho trovato il rails guides for custom validators troppo codificato ... Sto postando questo qui anche se non è esattamente quello che hai chiesto, ma il titolo Q si adatta perfettamente (motivo per cui ho letto questo post per il mio problema).

validazione personalizzata con un messaggio 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!"