使用I18n覆盖嵌套属性名称

时间:2015-06-02 15:25:54

标签: ruby-on-rails attributes rails-i18n

我有两个模型StoreStoreDetail如下:

class Store
   has_one :store_detail, dependent: :destroy
end

和StoreDetail:

class StoreDetail
   belongs_to :store, class_name: 'Store'
   belongs_to :state, class_name: 'State'
   belongs_to :city, class_name: 'City'
   belongs_to :zip_code, class_name: 'Zip Code'
end

我覆盖了state的属性,如下所示:

attributes:
  store/store_detail:
    state: "State"
    city: "City"
    zip_code: "Zip Code"

但是我收到了验证消息:

Store detail state can't be blank
Store detail city can't be blank
Store detail zip code can't be blank

我想在没有“商店详细信息”的情况下制作它,如下所示:

State can't be blank

如何覆盖嵌套属性?

2 个答案:

答案 0 :(得分:0)

您可以使用自定义验证消息:

class StoreDetail < ActiveRecord::Base
  validates :state_id, presence: true,
  message: I18n.t(:state_cant_be_blank)
end

然后在locales / *。yml

 en:
   state_cant_be_blank: State can't be blank

答案 1 :(得分:0)

i18n非常有可能:

en:
  activerecord:
    errors:
      models:
        store_detail:
          attributes:
            state:
              blank: State can't be blank.
            city:
              blank: City can't be blank.
            zip_code:
              blank: Zip code cant't be blank.

非常重要

  • 以&#34; en&#34;开头的所有嵌套标签以&#34;模特&#34;结束必须与示例中指定的完全一致。

  • 对于en.yml中的模型名称(或您使用的任何kangage文件)至关重要

  • 模型名称必须与model.rb匹配,因为这标识了要为activerecord验证的字段名称

  • 验证字段名称必须与schema.rb字段名称匹配,例如zip_code,而不是zip。

  • &#34;空白:&#34;标识符告诉Rails activerecord组件在特定验证失败时执行字符串替换i18n yaml文件中的字符串。

调试i18n (已添加)

  • 验证YAML :如果您没有看到您定义的en.yml验证消息,但默认值仍然显示,则您的en.yml由于某种原因无法运行。 YAML非常挑剔文件中的空格和文件中的任何尾随空格等。但它没有显示任何错误,它只是恢复使用Rails默认消息。这是一个YAML Lint工具:http://yaml-online-parser.appspot.com/

  • 适用于i18n的Rails规范http://guides.rubyonrails.org/i18n.html

  • 调试i18n :使用gem i18n-tasks创建i18n组件的综合报告:https://github.com/glebm/i18n-tasks

  • Application.rb :确保您已安装i18n。

# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
  config.i18n.default_locale = :en
  config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] 

如果您需要针对activerecord类型错误的自定义错误消息,则必须通过i18n进行操作。这不是一件很整洁的事情。它根本不是DRY,但它是可用的。