提交 daaa21bc 编写于 作者: X Xavier Noria

several enhancements to humanize [closes #12288]

* Strips leading underscores.
* Changes some unnecessary gsub!s to sub!s.
* Replaces some anchors ^, $ with \A, \z.
* Documents that human inflection rules are applied.
* Documents that words are downcased except acronyms.
* Adds an example with an acronym.
* Rewords docs.
上级 d9758192
* `humanize` strips leading underscores, if any.
Before:
'_id'.humanize # => ""
After:
'_id'.humanize # => "Id"
*Xavier Noria*
* Fixed backward compatibility isues introduced in 326e652. * Fixed backward compatibility isues introduced in 326e652.
Empty Hash or Array should not present in serialization result. Empty Hash or Array should not present in serialization result.
......
...@@ -99,26 +99,46 @@ def underscore(camel_cased_word) ...@@ -99,26 +99,46 @@ def underscore(camel_cased_word)
word word
end end
# Capitalizes the first word, turns underscores into spaces, and strips a # Tweaks an attribute name for display to end users.
# trailing '_id' if present. #
# Like +titleize+, this is meant for creating pretty output. # Specifically, +humanize+ 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 # The capitalization of the first word can be turned off by setting the
# optional parameter +capitalize+ to false. # +:capitalize+ option to false (default is true).
# By default, this parameter is true.
# #
# humanize('employee_salary') # => "Employee salary" # humanize('employee_salary') # => "Employee salary"
# humanize('author_id') # => "Author" # humanize('author_id') # => "Author"
# humanize('author_id', capitalize: false) # => "author" # humanize('author_id', capitalize: false) # => "author"
# humanize('_id') # => "Id"
#
# If "SSL" was defined to be an acronym:
#
# humanize('ssl_error') # => "SSL error"
#
def humanize(lower_case_and_underscored_word, options = {}) def humanize(lower_case_and_underscored_word, options = {})
result = lower_case_and_underscored_word.to_s.dup result = lower_case_and_underscored_word.to_s.dup
inflections.humans.each { |(rule, replacement)| break if result.sub!(rule, replacement) } inflections.humans.each { |(rule, replacement)| break if result.sub!(rule, replacement) }
result.gsub!(/_id$/, "")
result.sub!(/\A_+/, '')
result.sub!(/_id\z/, '')
result.tr!('_', ' ') result.tr!('_', ' ')
result.gsub!(/([a-z\d]*)/i) { |match|
result.gsub!(/([a-z\d]*)/i) do |match|
"#{inflections.acronyms[match] || match.downcase}" "#{inflections.acronyms[match] || match.downcase}"
} end
result.gsub!(/^\w/) { |match| match.upcase } if options.fetch(:capitalize, true)
if options.fetch(:capitalize, true)
result.sub!(/\A\w/) { |match| match.upcase }
end
result result
end end
......
...@@ -208,9 +208,11 @@ module InflectorTestCases ...@@ -208,9 +208,11 @@ module InflectorTestCases
} }
UnderscoreToHuman = { UnderscoreToHuman = {
"employee_salary" => "Employee salary", 'employee_salary' => 'Employee salary',
"employee_id" => "Employee", 'employee_id' => 'Employee',
"underground" => "Underground" 'underground' => 'Underground',
'_id' => 'Id',
'_external_id' => 'External'
} }
UnderscoreToHumanWithoutCapitalize = { UnderscoreToHumanWithoutCapitalize = {
......
...@@ -1768,21 +1768,36 @@ NOTE: Defined in `active_support/core_ext/string/inflections.rb`. ...@@ -1768,21 +1768,36 @@ NOTE: Defined in `active_support/core_ext/string/inflections.rb`.
#### `humanize` #### `humanize`
The method `humanize` gives you a sensible name for display out of an attribute name. To do so it replaces underscores with spaces, removes any "_id" suffix, and capitalizes the first word: The method `humanize` tqweaks 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).
```ruby ```ruby
"name".humanize # => "Name" "name".humanize # => "Name"
"author_id".humanize # => "Author" "author_id".humanize # => "Author"
"comments_count".humanize # => "Comments count" "author_id".humanize(capitalize: false) # => "author"
"comments_count".humanize # => "Comments count"
"_id".humanize # => "Id"
``` ```
The capitalization of the first word can be turned off by setting the optional parameter `capitalize` to false: If "SSL" was defined to be an acronym:
```ruby ```ruby
"author_id".humanize(capitalize: false) # => "author" 'ssl_error'.humanize # => "SSL error"
``` ```
The helper method `full_messages` uses `humanize` as a fallback to include attribute names: The helper method `full_messages` uses `humanize` as a fallback to include
attribute names:
```ruby ```ruby
def full_messages def full_messages
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册