代码之家  ›  专栏  ›  技术社区  ›  starfry

转换模型嵌套属性验证消息

  •  12
  • starfry  · 技术社区  · 10 年前

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

    该模型称为 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 没有区别。

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

    3 回复  |  直到 10 年前
        1
  •  14
  •   starfry    10 年前

    将一些调试输出添加到 human_attribute_name 方法揭示了i18n路径应该是什么。

    该示例具有 user 带有 has_many :identities 关系所需属性为 identity ,的属性 Identity 模型,其中 User 模型 有很多 .

    我往里看了看 gems/activemodel-4.0.1/lib/active_model 文件 translation.rb 这个 人属性名称 方法查找以下路径:

    :"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
  •  -1
  •   Matt Gibson    10 年前

    试试看:

    en:
      activerecord:
        errors:
          models:
            identity:
              attributes:
                identity:
                  blank: 'Your new error message here'
    
        3
  •  -1
  •   RAJ    10 年前

    您可以只在db属性名称前面提供转换后的值。

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

    您可能想了解更多关于活动模型的信息 attribute localization