如何为命名空间资源BudgetLine::Accommodation的嵌套表单定义I18n翻译
解决Rails命名空间模型嵌套关联字段的I18n翻译问题
要让BudgetLine::Accommodation.human_attribute_name("budget_line_items.unit")返回正确的翻译结果,你需要调整YAML配置的层级结构,把嵌套关联字段的翻译挂载到父模型budget_line/accommodation的属性节点下,而非将budget_line_items当作独立的命名空间模型配置。
正确的I18n配置
en: activerecord: attributes: budget_line/accommodation: budget_line_items: unit: "Room" price: "Price (USD)"
原理说明
调用Model.human_attribute_name("association.field")时,Rails的翻译查找逻辑是:
- 优先查找
activerecord.attributes.[模型名].[关联名].[字段名]路径 - 若未找到匹配项,会回退到全局的关联模型字段翻译,即
activerecord.attributes.[关联模型名].[字段名]
你之前的配置错误在于把budget_line_items当作budget_line/accommodation的子模型处理,但实际上它是父模型的关联属性,因此需要嵌套在budget_line/accommodation的属性节点下。
验证方法
在Rails控制台执行以下命令,确认翻译生效:
BudgetLine::Accommodation.human_attribute_name("budget_line_items.unit") # 应返回 "Room"
如果需要给BudgetLineItem的字段设置全局通用翻译(所有父模型共用),可以直接配置:
en: activerecord: attributes: budget_line_item: unit: "Unit" price: "Price"
内容的提问来源于stack exchange,提问作者Magnus Remøe
相关产品推荐
相关产品推荐

