覆盖rails3中模型名称的默认复数
Posted
技术标签:
【中文标题】覆盖rails3中模型名称的默认复数【英文标题】:override default pluralize for model-name in rails3 【发布时间】:2011-09-04 22:53:18 【问题描述】:我的语言环境是 :de,我喜欢这样:
Sheet.model_name.human.pluralize # => Belegs
给我添加一个尾随的“e”而不是“s”
Sheet.model_name.human.pluralize # => Belege
仅适用于 Sheet 类。 我可以在我的 config/locales/models/de.yml 中添加它吗?
【问题讨论】:
相关:***.com/q/1185035/1505348 【参考方案1】:首先,您需要停止使用.pluralize
。它使用 Inflector(主要用于 Rails 内部,例如猜测模型表的表名 -> 表)。
Sheet.model_name.human # => "Beleg"
"Beleg".pluralize # => "Belegs"
您应该做的是使用:count
选项。
Sheet.model_name.human(:count => 2) # => "Belege"
这要求您修改您的de.yml
:
de:
...
activerecord:
...
models:
sheet:
one: Beleg
other: Belege
【讨论】:
看起来不错,我试过但似乎不适用于模型类名称。 我添加了一个解释为什么你不能使用复数形式。变形器并不是为了解决 i18n 问题。 语言环境文件中的模型名称应该是单数,而不是复数(“sheet”,而不是“sheets”)。 @Marcel Jackwerth:只是好奇。在 YAML 文件中,您使用“one”和“other”。human
函数中是否有等同于“其他”的功能(例如 Sheet.model_name.human(:count => lots)
?如果可以有数百个条目,那么将 2 放在那里似乎很奇怪..
@Shawn 实际上你可以使用100000
或任何你想要的。使用:count => "foo"
也将查找other
翻译。当前的实现只检查:zero if count == 0
和count == 1 ? :one : :other
。这是full code。【参考方案2】:
您可以通过这种方式覆盖复数形式:
在config/initializers/inflections.rb
做:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'Beleg', 'Belege'
end
【讨论】:
【参考方案3】:如果您不喜欢明确的计数(例如 2),您可以使用 :many
例如
Sheet.model_name.human(count => :many)
或没有哈希火箭(对于 Ruby >= 1.9):
Sheet.model_name.human(count: :many)
【讨论】:
哈希表示法与 Rails 无关。 Ruby 1.9 附带了新语法。 我不知道。谢谢。 明确地说,:many
并不特别。除非您传入1
,否则它将始终选择:other
,例如Sheet.model_name.human(count: :awesome)
以上是关于覆盖rails3中模型名称的默认复数的主要内容,如果未能解决你的问题,请参考以下文章