Перевести сообщение о проверке вложенности атрибута модели

У меня есть вложенный атрибут, на котором я выполняю проверку присутствия. Я безуспешно пытаюсь предоставить переводы для имени атрибута, который возвращается в полном тексте сообщения об ошибке.

Модель называется Identity и содержит атрибут Identity. Модель вложен в другую с отношением has_many.

В настоящее время возвращается типичное сообщение об ошибке

Identities identity can't be blank

Я хочу перевести атрибут (по умолчанию Identities identity) во что-то другое.

У меня

en:
  activerecord:
    models:
      identity:
        identity: "whatever"

Если я это сделаю, я получаю сообщение об ошибке

I18n::InvalidPluralizationData (translation data {:identity=>"whatever"} can not be used with :count => 1):

Я попытался добавить плюрализационные данные к этому, изменив приведенное выше на

en:
  activerecord:
    models:
      identity:
        identity:
          one: "one"
          other: "other"

Это изменяет ошибку на

I18n::InvalidPluralizationData (translation data {:identity=>{:one=>"one", :other=>"other"}} can not be used with :count => 1):

Я также пробовал many вместо other без разницы.

Я потратил несколько часов, пытаясь сделать эту работу, прочитав другие вопросы о переполнении стека и в других местах, без успеха. Каков правильный способ написания переводов для имен атрибутов?

Ответ 1

Добавление некоторого отладочного вывода в метод human_attribute_name показывает, каким должен быть путь i18n.

В примере используется модель user с отношением has_many :identities. Желаемый атрибут identity, атрибут модели identity, из которых модель user имеет много.

Я просмотрел gems/activemodel-4.0.1/lib/active_model, файл translation.rb. Метод human_attribute_name просматривает следующий путь:

:"activerecord.attributes.user/identities.identity"

Он также определяет следующие значения по умолчанию, которые являются резервными переводами:

:"activerecord.attributes.user/identities.identity"
:"activerecord.attributes.identities.identity"
:"attributes.identity"
"Identities identity"
"Identity"

последние два являются строками, первая будет соответствовать, если ни один из путей, представленных в виде символов, не соответствует имеющимся переводам. Таким образом, в случае отсутствия переводов на выходе будет строка "Identities identity" (другая строка "Identity" никогда не будет использоваться).

Итак, любой из следующих путей перевода будет работать:

activerecord.attributes.user/identities.identity
activerecord.attributes.identities.identity
attributes.identity

Пути проверяются в этом порядке, и первый из них соответствует тому, который будет использоваться.

Ответ 2

Попробуйте следующее:

en:
  activerecord:
    errors:
      models:
        identity:
          attributes:
            identity:
              blank: 'Your new error message here'

Ответ 3

Вы можете просто предоставить переведенные значения перед именами атрибутов db.

en:
  activerecord:
    attributes:
      identity: # this is model name
        identity: "translated attribute name"

Вы можете больше узнать об активной модели локализации атрибутов