我有一个嵌套属性,我在其上执行在线验证.我尝试没有成功提供在完整的错误消息文本中返回的属性名称的翻译.
该模型称为身份,并包含称为身份的属性该模型嵌套在另一个与has_many关系中.
此时会返回一个典型的错误消息
Identities identity can't be blank
我有
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):
我也尝试了许多而不是其他没有区别.
我花了几个小时试图做这项工作,在Stack Overflow和其他地方阅读了其他问题,没有成功.为属性名称编写翻译的正确方法是什么?
解决方法
将一些调试输出添加到human_attribute_name方法会显示出i18n路径应该是什么.
该示例具有一个具有has_many:identity关系的用户模型.所需的属性是身份,身份模型的属性,用户模型具有许多.
我查看了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"
最后两个是字符串,如果没有表示为符号的路径匹配可用的翻译,则第一个将匹配.所以,在没有翻译的情况下,输出将是字符串“标识身份”(另一个字符串,“标识”永远不会被使用).
所以,以下任何一种翻译路径都可以运行:
activerecord.attributes.user/identities.identity activerecord.attributes.identities.identity attributes.identity
路径是按照顺序进行的,首先匹配的是要使用的路径.