Перевести сообщение о проверке вложенности атрибута модели
У меня есть вложенный атрибут, на котором я выполняю проверку присутствия. Я безуспешно пытаюсь предоставить переводы для имени атрибута, который возвращается в полном тексте сообщения об ошибке.
Модель называется 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"
Вы можете больше узнать об активной модели локализации атрибутов