我有以下设置
class BudgetLine < ApplicationRecord
has_many :budget_line_items
accepts_nested_attributes_for :budget_line_items
end
class BudgetLine::Accommodation < BudgetLine
end
class BudgetLineItem < ApplicationRecord
belongs_to :budget_line
end
现在我尝试为
BudgetLineItem
内的 BudgetLine::Accommodation
的嵌套形式指定标签。根据 i18n documentation,你通常可以这样做:
en:
activerecord:
attributes:
user/role:
admin: "Admin"
contributor: "Contributor"
如果相关模型没有命名空间(如上面的 User 所示),则此方法有效。然而,当你想指定一个命名空间模型时,它具有相同的语法,所以它变成:
en:
activerecord:
attributes:
budget_line/accommodation/budget_line_items:
unit: Room
这不起作用。
我尝试过不同的变体,例如
en:
activerecord:
attributes:
budget_line:
accommodation/budget_line_items:
price: Price (USD)
这也不起作用,因为这种在语言环境中指定名称空间的方法似乎已被弃用。
据我了解,为了正确翻译标签,以下内容应该返回正确的翻译:
BudgetLine::Accommodation.human_attribute_name("budget_line_items.unit")
,但到目前为止,我尝试针对此目标的尝试并未成功。
有办法解决这个用例吗?
它并没有被贬低。你只是对它应该如何工作抱有不切实际的期望。
Rails 通过 ActiveModel::Naming 提供的 API 查找翻译,该 API 仅基于类名:
class Foo
extend ActiveModel::Naming
end
Foo.model_name.i18n_key == :foo # true
# This is the correct way to define nested classes
class Foo
class Bar
extend ActiveModel::Naming
end
end
Foo::Bar.i18n_key == :"foo/bar"
正如您所看到的,嵌套常量在 I18n 键的分隔符中使用
/
,因为 :
在 YAML 中具有特殊意义。
我不知道您是否可能混淆了常量嵌套(这是具有嵌套属性的语言级功能),或者只是以某种方式认为关联在其中发挥了作用(它们没有)。
如果您希望模型以不同的方式翻译,您可以使用具有不同嵌套的不同类:
class BudgetLine
class Accommodation < BudgetLine
class BudgetLineItem < ::BudgetLineItem
# ...
end
end
end