Rails自动将属性名称人性化。我想把这些人性化的名字作为标题案例。例如,MyModel.full_name
目前显示为'Full name'
,但我希望“n”大写:'Full Name'
。
我目前在en.yml中定义多字属性,根本不是DRY。我想覆盖.humanize
。让.humanize
以我想要的方式工作的最佳方法是什么?
加分问题:
不幸的是,Rails'.titleize
忽略了英文标题规则。像'a'和'to'这样的词不应该大写,除非它们是字符串的第一个或最后一个字。我们怎么能解决这个问题?
MyModel.time_to_failure
应为'Time to Failure'
,但MyModel.send_to
应为'Send To'
。
答案 0 :(得分:1)
感谢您的建议! @Arup Rakshit,你的建议指向ActiveModel::Translation#human_attribute_name
,结果证明这是在Rails 4中做到这一点的方法。
这就是我的所作所为:
<强>的Gemfile 强>:
gem 'titleize'
<强>配置/初始化/ human_attribute_name.rb 强>:
# Overrides human_attribute_name so model attributes are title case.
# Combine with the titleize gem which overrides String#titleize with English-language rules.
module ActiveModel::Translation
def human_attribute_name(attribute, options = {})
options = { count: 1 }.merge!(options)
parts = attribute.to_s.split(".")
attribute = parts.pop
namespace = parts.join("/") unless parts.empty?
attributes_scope = "#{self.i18n_scope}.attributes"
if namespace
defaults = lookup_ancestors.map do |klass|
:"#{attributes_scope}.#{klass.model_name.i18n_key}/#{namespace}.#{attribute}"
end
defaults << :"#{attributes_scope}.#{namespace}.#{attribute}"
else
defaults = lookup_ancestors.map do |klass|
:"#{attributes_scope}.#{klass.model_name.i18n_key}.#{attribute}"
end
end
defaults << :"attributes.#{attribute}"
defaults << options.delete(:default) if options[:default]
defaults << attribute.titleize
options[:default] = defaults
I18n.translate(defaults.shift, options)
end
end
# If you're using Rails enums and the enum_help gem to make them translatable, use this code to default to titleize instead of humanize
module EnumHelp::Helper
def self.translate_enum_label(klass, attr_name, enum_label)
::I18n.t("enums.#{klass.to_s.underscore.gsub('/', '.')}.#{attr_name}.#{enum_label}", default: enum_label.titleize)
end
end
如果你没有使用枚举和enum_help,请删除最后一位。
关注也会起作用,但在我的项目中,没有理由不将它应用于每个模型。
美丽!