如何在Rails 3.1中的失败验证中国际化(I18n)一般错误消息?

时间:2013-04-14 16:54:40

标签: validation ruby-on-rails-3.1 nested-forms

我希望能够提供国际化,有用的错误消息。

我有嵌套表单提交的一般错误消息部分视图呈现

    # _error_messages.html.erb - Fragment
    ...

    <strong><%= t('errors.template.body') %> </strong>       
    <ul>
      <% object.errors.full_messages.each do |msg| %>
        <li><%= msg %> </li>
      <% end %>
    </ul>

    ...

我得到国际化的正文消息,但是,我无法弄清楚如何替换该属性,或者更具体地说,该模型字段的“:blank”错误(即validates_presence_of:name)验证尽管有多次yaml迭代。< / p>

这是我的yaml片段

en:
  errors: &errors
    format: ! '%{attribute} -- %{message}'
      messages:
        accepted: must be accepted
        blank: must not be blank
        body: ! 'There were problems with the following fields:'


    activemodel:
        attributes:
          family_wizard: 
            children: kids

我写了这样的yaml,因为当我将子项名称字段留空时(> validates_presence_of:name)检查传递给partial的错误对象时,看起来像这样:

#<ActiveModel::Errors:0x007111111C111111 @base=#<FamilyWizard id: nil, ...>, 
    @messages {:children=>["must not be blank"]}>

但我能得出的唯一错误信息是:

以下字段存在问题:

  • 儿童 - 不能空白

理想的解决方案错误消息如下所示:

以下字段存在问题:

  • 孩子 - 名称不得为空白

这个Stack Overflow问题(How to localize a generic error messages partial in Rails 3.2.3?)在正确的轨道上,但它缺少我想要的activemodel / activerecord验证部分。

1 个答案:

答案 0 :(得分:0)

这个问题的答案是我的范围错误,因为我的yaml文件存在两个问题。错误的间距和错误的标签。它应该是activerecord而不是activemodel,而activerecord范围应该与树中的错误范围处于同一级别。

为了翻译模型的属性(即,儿童到孩子),yaml看起来像这样:

en:
  errors: &errors
    format: ! '%{attribute} -- %{message}'
      messages:
        accepted: must be accepted
        blank: must not be blank
        body: ! 'There were problems with the following fields:'


  activerecord:
    attributes:
      family_wizard: 
        children: kids

帮助我得到答案的两个资源是: