Method: Fusu::String::Methods#humanize

Defined in:
lib/fusu/string/methods.rb

#humanize(lower_case_and_underscored_word, capitalize: true, keep_id_suffix: false) ⇒ Object

Tweaks an attribute name for display to end users.

Specifically, performs these transformations:

  • Applies human inflection rules to the argument.

  • Deletes leading underscores, if any.

  • Removes a “_id” suffix if present.

  • Replaces underscores with spaces, if any.

  • Downcases all words except acronyms.

  • Capitalizes the first word.

The capitalization of the first word can be turned off by setting the :capitalize option to false (default is true).

The trailing ‘_id’ can be kept and capitalized by setting the optional parameter keep_id_suffix to true (default is false).

humanize('employee_salary')                  # => "Employee salary"
humanize('author_id')                        # => "Author"
humanize('author_id', capitalize: false)     # => "author"
humanize('_id')                              # => "Id"
humanize('author_id', keep_id_suffix: true)  # => "Author Id"

If “SSL” was defined to be an acronym:

humanize('ssl_error') # => "SSL error"


102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/fusu/string/methods.rb', line 102

def humanize(lower_case_and_underscored_word, capitalize: true, keep_id_suffix: false)
  result = lower_case_and_underscored_word.to_s.dup

  # inflections.humans.each { |(rule, replacement)| break if result.sub!(rule, replacement) }

  result.sub!(/\A_+/, "".freeze)
  unless keep_id_suffix
    result.sub!(/_id\z/, "".freeze)
  end
  result.tr!("_".freeze, " ".freeze)

  result.gsub!(/([a-z\d]*)/i) do |match|
    "#{match.downcase}"
  end

  if capitalize
    result.sub!(/\A\w/) { |match| match.upcase }
  end

  result
end