2012-02-13 10 views
7

¿Alguien tiene algunos consejos sobre cómo traducir asociaciones de modelos en Rails?Traducir Asociación de modelos de rieles - no funciona

Por ejemplo: Tengo un modelo de persona, que puede tener muchos teléfonos. Sin embargo, una Persona necesita tener al menos un Teléfono. No puedo traducir esa validación. Lo mejor que podía hacer era esto:

validates_presence_of :phones, :message => "At least one phone is required." 

Y en mi YAML, que sustituye esta línea para omitir el %{attribute}:

format: ! '%{message}' 

De esta manera sólo se muestra mi mensaje, y evitar el des- nombre de campo traducido para ser mostrado.

Esto me está causando muchos dolores de cabeza, porque algunas gemas simplemente no me permiten pasar :message => "something describing the error", así que quería configurar todos los mensajes de error a través de mi YAML.

Además, con algunos modelos puedo traducir sus atributos, mientras que con otros no. Por ejemplo:

activerecord: 
    attributes: 
    additional_info: 
     account_manager: "Manager" 

Esto funciona. Puedo ver en mi formulario "Gerente". Sin embargo, cuando este campo tenga un error, Rails lo mostrará como "Additional info account manager can't be blank".

yo probamos este:

activerecord:   
    errors: 
    models: 
     additional_info: 
     attributes: 
      account_manager: "Manager" 

Pero no hubo suerte.

He leído los documentos, pero no tengo idea de por qué está sucediendo.

Respuesta

9

Rails 3.2 ha cambiado este comportamiento. La forma en que publiqué antes está obsoleta.

Ahora, para traducir asociaciones, existe la necesidad de agregar una barra inclinada (en lugar de anidar todo). Así que en lugar de esto:

activerecord: 
     attributes: 
     person: 
      additional_info: 
      account_manager: "Manager" 

La correcta ahora es:

activerecord: 
     attributes: 
     person: 
      additional_info/account_manager: "Manager" 

Además, me di cuenta de que has_many asociaciones están siendo traducidos de forma diferente de eso. Si desea traducir esos, el siguiente ejemplo puede ayudar:

activerecord: 
     attributes: 
     emails: 
      address: "E-mail field" 

En lugar del nombre del modelo, como lo hice anteriormente, es necesario pasar el nombre de la asociación, en este caso emails.

Comprobar este comentario y tirar de solicitud para obtener más información:

https://github.com/rails/rails/commit/c19bd4f88ea5cf56b2bc8ac0b97f59c5c89dbff7#commitcomment-619858

https://github.com/rails/rails/pull/3859

+0

yo estaba pensando en algo como esto, pero no suerte con la posición exacta de los artículos y no suerte en cómo llegar a ella, gracias !, muy apreciado – Alexis

7

Aquí están los caminos de clave válidos para los carriles 4.1:

# Basic Attribute on Model 
activerecord: 
    attributes: 
    #{model_class.model_name.i18n_key}: 
     #{attribute_name}: 
     "Localized Value" 

# Attribute on Nested Model 
activerecord: 
    attributes: 
    #{model_class.model_name.i18n_key}/#{association_name}: 
     #{attribute_name}: 
     "Localized Value" 
    #{association_name}: 
     #{attribute_name}: 
     "Fallback Localized Value" 

Así que, dado este modelo (que tiene la i18n_key de :person):

class Person 
    has_many :friends 
end 

Habría que estas definiciones de localización:

activerecord: 
    attributes: 
    person: 
     first_name: 
     "My Name" 
    person/friends: 
     first_name: 
     "My Friend's Name" 
    friends: 
     first_name: 
     "A Friend's Name" 

Si su modelo es una espacio de nombre, como:

class MyApp::Person 
    has_many :friends 
end 

la i18n_key se convierte en :my_app/person y su / comienza a desgastarse clave:

activerecord: 
    attributes: 
    my_app/person: 
     first_name: 
     "My Name" 
    my_app/person/friends: 
     first_name: 
     "My Friend's Name" 
    friends: 
     first_name: 
     "A Friend's Name" 
Cuestiones relacionadas