Module: Saint::Inflector
- Extended by:
- Inflector
- Included in:
- Assoc, ClassApi, Filter, FilterInstance, FmExtender, Inflector, ORMUtils
- Defined in:
- lib/saint/inflector/inflections.rb,
lib/saint/inflector/inflections.rb
Overview
The Inflector transforms words from singular to plural, class names to table names, modularized class names to ones without, and class names to foreign keys. The default inflections for pluralization, singularization, and uncountable words are kept in inflections.rb.
The Rails core team has stated patches for the inflections library will not be accepted in order to avoid breaking legacy applications which may be relying on errant inflections. If you discover an incorrect inflection and require it for your application, you'll need to correct it yourself (explained below).
Defined Under Namespace
Classes: Inflections
Instance Method Summary (collapse)
-
- (Object) camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
By default, +camelize+ converts strings to UpperCamelCase.
-
- (Object) classify(table_name)
Create a class name from a plural table name like Rails does for table names to models.
- - (Object) constantize(camel_cased_word)
-
- (Object) dasherize(underscored_word)
Replaces underscores with dashes in the string.
-
- (Object) demodulize(class_name_in_module)
Removes the module part from the expression in the string.
-
- (Object) foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
Creates a foreign key name from a class name.
-
- (Object) humanize(lower_case_and_underscored_word)
Capitalizes the first word and turns underscores into spaces and strips a trailing "_id", if any.
-
- (Object) inflections
Yields a singleton instance of Inflector::Inflections so you can specify additional inflector rules.
-
- (Object) ordinalize(number)
Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
-
- (Object) pluralize(word)
Returns the plural form of the word in the string.
-
- (Object) singularize(word)
The reverse of +pluralize+, returns the singular form of a word in a string.
-
- (Object) tableize(class_name)
Create the name of a table like Rails does for models to table names.
-
- (Object) titleize(word)
Capitalizes all the words and replaces some characters in the string to create a nicer looking title.
-
- (Object) underscore(camel_cased_word)
Makes an underscored, lowercase form from the expression in the string.
Instance Method Details
- (Object) camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
By default, +camelize+ converts strings to UpperCamelCase. If the argument to +camelize+ is set to :lower then +camelize+ produces lowerCamelCase.
+camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.
Examples: "active_record".camelize # => "ActiveRecord" "active_record".camelize(:lower) # => "activeRecord" "active_record/errors".camelize # => "ActiveRecord::Errors" "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
As a rule of thumb you can think of +camelize+ as the inverse of +underscore+, though there are cases where that does not hold:
"SSLError".underscore.camelize # => "SslError"
241 242 243 244 245 246 247 |
# File 'lib/saint/inflector/inflections.rb', line 241 def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true) if first_letter_in_uppercase lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } else lower_case_and_underscored_word.to_s[0].chr.downcase + camelize(lower_case_and_underscored_word)[1..-1] end end |
- (Object) classify(table_name)
Create a class name from a plural table name like Rails does for table names to models. Note that this returns a string and not a Class. (To convert to an actual class follow +classify+ with +constantize+.)
Examples: "egg_and_hams".classify # => "EggAndHam" "posts".classify # => "Post"
Singular names are not handled correctly: "business".classify # => "Busines"
209 210 211 212 |
# File 'lib/saint/inflector/inflections.rb', line 209 def classify(table_name) # strip out any leading schema name camelize(singularize(table_name.to_s.sub(/.*\./, ''))) end |
- (Object) constantize(camel_cased_word)
320 321 322 323 324 325 326 327 328 329 |
# File 'lib/saint/inflector/inflections.rb', line 320 def constantize(camel_cased_word) names = camel_cased_word.split('::') names.shift if names.empty? || names.first.empty? constant = Object names.each do |name| constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name) end constant end |
- (Object) dasherize(underscored_word)
Replaces underscores with dashes in the string.
Example: "puni_puni" # => "puni-puni"
275 276 277 |
# File 'lib/saint/inflector/inflections.rb', line 275 def dasherize(underscored_word) underscored_word.gsub(/_/, '-') end |
- (Object) demodulize(class_name_in_module)
Removes the module part from the expression in the string.
Examples: "ActiveRecord::CoreExtensions::String::Inflections".demodulize # => "Inflections" "Inflections".demodulize # => "Inflections"
284 285 286 |
# File 'lib/saint/inflector/inflections.rb', line 284 def demodulize(class_name_in_module) class_name_in_module.to_s.gsub(/^.*::/, '') end |
- (Object) foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
Creates a foreign key name from a class name. +separateclass_name_and_id_with_underscore+ sets whether the method should put '' between the name and 'id'.
Examples: "Message".foreign_key # => "message_id" "Message".foreign_key(false) # => "messageid" "Admin::Post".foreign_key # => "post_id"
296 297 298 |
# File 'lib/saint/inflector/inflections.rb', line 296 def foreign_key(class_name, separate_class_name_and_id_with_underscore = true) underscore(demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? "_id" : "id") end |
- (Object) humanize(lower_case_and_underscored_word)
Capitalizes the first word and turns underscores into spaces and strips a trailing "_id", if any. Like +titleize+, this is meant for creating pretty output.
Examples: "employee_salary" # => "Employee salary" "author_id" # => "Author"
168 169 170 171 172 173 |
# File 'lib/saint/inflector/inflections.rb', line 168 def humanize(lower_case_and_underscored_word) result = lower_case_and_underscored_word.to_s.dup inflections.humans.each { |(rule, replacement)| break if result.gsub!(rule, replacement) } result.gsub(/_id$/, "").gsub(/_/, " ").capitalize end |
- (Object) inflections
Yields a singleton instance of Inflector::Inflections so you can specify additional inflector rules.
Example: ActiveSupport::Inflector.inflections do |inflect| inflect.uncountable "rails" end
116 117 118 119 120 121 122 |
# File 'lib/saint/inflector/inflections.rb', line 116 def inflections if block_given? yield Inflections.instance else Inflections.instance end end |
- (Object) ordinalize(number)
Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
Examples: ordinalize(1) # => "1st" ordinalize(2) # => "2nd" ordinalize(1002) # => "1002nd" ordinalize(1003) # => "1003rd" ordinalize(-11) # => "-11th" ordinalize(-1021) # => "-1021st"
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 |
# File 'lib/saint/inflector/inflections.rb', line 353 def ordinalize(number) if (11..13).include?(number.to_i.abs % 100) "#{number}th" else case number.to_i.abs % 10 when 1; "#{number}st" when 2; "#{number}nd" when 3; "#{number}rd" else "#{number}th" end end end |
- (Object) pluralize(word)
Returns the plural form of the word in the string.
Examples: "post".pluralize # => "posts" "octopus".pluralize # => "octopi" "sheep".pluralize # => "sheep" "words".pluralize # => "words" "CamelOctopus".pluralize # => "CamelOctopi"
132 133 134 135 136 137 138 139 140 141 |
# File 'lib/saint/inflector/inflections.rb', line 132 def pluralize(word) result = word.to_s.dup if word.empty? || inflections.uncountables.include?(result.downcase) result else inflections.plurals.each { |(rule, replacement)| break if result.gsub!(rule, replacement) } result end end |
- (Object) singularize(word)
The reverse of +pluralize+, returns the singular form of a word in a string.
Examples: "posts".singularize # => "post" "octopi".singularize # => "octopus" "sheep".singularize # => "sheep" "word".singularize # => "word" "CamelOctopi".singularize # => "CamelOctopus"
151 152 153 154 155 156 157 158 159 160 |
# File 'lib/saint/inflector/inflections.rb', line 151 def singularize(word) result = word.to_s.dup if inflections.uncountables.any? { |inflection| result =~ /\b(#{inflection})\Z/i } result else inflections.singulars.each { |(rule, replacement)| break if result.gsub!(rule, replacement) } result end end |
- (Object) tableize(class_name)
Create the name of a table like Rails does for models to table names. This method uses the +pluralize+ method on the last word in the string.
Examples "RawScaledScorer".tableize # => "raw_scaled_scorers" "egg_and_ham".tableize # => "egg_and_hams" "fancyCategory".tableize # => "fancy_categories"
195 196 197 |
# File 'lib/saint/inflector/inflections.rb', line 195 def tableize(class_name) pluralize(underscore(class_name)) end |
- (Object) titleize(word)
Capitalizes all the words and replaces some characters in the string to create a nicer looking title. +titleize+ is meant for creating pretty output. It is not used in the Rails internals.
+titleize+ is also aliased as as +titlecase+.
Examples: "man from the boondocks".titleize # => "Man From The Boondocks" "x-men: the last stand".titleize # => "X Men: The Last Stand"
184 185 186 |
# File 'lib/saint/inflector/inflections.rb', line 184 def titleize(word) humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize } end |
- (Object) underscore(camel_cased_word)
Makes an underscored, lowercase form from the expression in the string.
Changes '::' to '/' to convert namespaces to paths.
Examples: "ActiveRecord".underscore # => "active_record" "ActiveRecord::Errors".underscore # => active_record/errors
As a rule of thumb you can think of +underscore+ as the inverse of +camelize+, though there are cases where that does not hold:
"SSLError".underscore.camelize # => "SslError"
261 262 263 264 265 266 267 268 269 |
# File 'lib/saint/inflector/inflections.rb', line 261 def underscore(camel_cased_word) word = camel_cased_word.to_s.dup word.gsub!(/::/, '/') word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') word.gsub!(/([a-z\d])([A-Z])/, '\1_\2') word.tr!("-", "_") word.downcase! word end |