翻译模型嵌套属性验证消息

sta*_*fry 12 ruby-on-rails activemodel rails-i18n

我有一个嵌套属性,我在其上执行状态验证.我正在尝试没有成功提供完整错误消息文本中返回的属性名称的翻译.

调用模型Identity并包含一个名为identity的模型.模型嵌套在另一个具有has_many关系的模型中.

当前返回典型的错误消息

Identities identity can't be blank
Run Code Online (Sandbox Code Playgroud)

我想将属性(默认情况下Identities identity)转换为其他内容.

我有

en:
  activerecord:
    models:
      identity:
        identity: "whatever"
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会收到错误

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

我试图通过改变上面的内容来为此添加复数数据

en:
  activerecord:
    models:
      identity:
        identity:
          one: "one"
          other: "other"
Run Code Online (Sandbox Code Playgroud)

这会将错误更改为

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

我也试过many而不是other没有区别.

我已经花了几个小时试图完成这项工作,在Stack Overflow和其他地方阅读了其他问题但没有成功.为属性名称编写翻译的正确方法是什么?

sta*_*fry 13

human_attribute_name方法中添加一些调试输出可以显示i18n路径应该是什么.

该示例具有一个user具有has_many :identities关系的模型.所需属性是模型identity的属性,模型具有许多属性.IdentityUser

我查了一下gems/activemodel-4.0.1/lib/active_model,档案translation.rb.该human_attribute_name方法查找以下路径:

:"activerecord.attributes.user/identities.identity"
Run Code Online (Sandbox Code Playgroud)

它还指定以下默认值,即后备转换:

:"activerecord.attributes.user/identities.identity"
:"activerecord.attributes.identities.identity"
:"attributes.identity"
"Identities identity"
"Identity"
Run Code Online (Sandbox Code Playgroud)

最后两个是字符串,如果没有表示为符号的路径与可用的翻译匹配,则第一个将匹配.因此,在没有翻译的情况下,输出将是字符串"Identities identity"(另一个字符串,"Identity"将永远不会被使用).

因此,以下任何转换路径都可以使用:

activerecord.attributes.user/identities.identity
activerecord.attributes.identities.identity
attributes.identity
Run Code Online (Sandbox Code Playgroud)

路径按此顺序尝试,匹配的第一个是将要使用的路径.