Rails:如何使人性化属性标题化

时间:2016-06-14 16:32:01

标签: ruby-on-rails ruby

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'

1 个答案:

答案 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,请删除最后一位。

关注也会起作用,但在我的项目中,没有理由不将它应用于每个模型。

美丽!