Module ActiveSupport::Inflector
In: vendor/rails/activesupport/lib/active_support/inflector.rb

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).

Methods

Classes and Modules

Class ActiveSupport::Inflector::Inflections

Public Instance methods

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 178
178:     def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
179:       if first_letter_in_uppercase
180:         lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
181:       else
182:         lower_case_and_underscored_word.first.downcase + camelize(lower_case_and_underscored_word)[1..-1]
183:       end
184:     end

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 318
318:     def classify(table_name)
319:       # strip out any leading schema name
320:       camelize(singularize(table_name.to_s.sub(/.*\./, '')))
321:     end

Tries to find a constant with the name specified in the argument string:

  "Module".constantize     # => Module
  "Test::Unit".constantize # => Test::Unit

The name is assumed to be the one of a top-level constant, no matter whether it starts with "::" or not. No lexical context is taken into account:

  C = 'outside'
  module M
    C = 'inside'
    C               # => 'inside'
    "C".constantize # => 'outside', same as ::C
  end

NameError is raised when the name is not in CamelCase or the constant is unknown.

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 355
355:       def constantize(camel_cased_word)
356:         names = camel_cased_word.split('::')
357:         names.shift if names.empty? || names.first.empty?
358: 
359:         constant = Object
360:         names.each do |name|
361:           constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
362:         end
363:         constant
364:       end

Replaces underscores with dashes in the string.

Example:

  "puni_puni" # => "puni-puni"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 218
218:     def dasherize(underscored_word)
219:       underscored_word.gsub(/_/, '-')
220:     end

Removes the module part from the expression in the string.

Examples:

  "ActiveRecord::CoreExtensions::String::Inflections".demodulize # => "Inflections"
  "Inflections".demodulize                                       # => "Inflections"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 240
240:     def demodulize(class_name_in_module)
241:       class_name_in_module.to_s.gsub(/^.*::/, '')
242:     end

Creates a foreign key name from a class name. separate_class_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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 331
331:     def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
332:       underscore(demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? "_id" : "id")
333:     end

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 228
228:     def humanize(lower_case_and_underscored_word)
229:       result = lower_case_and_underscored_word.to_s.dup
230: 
231:       inflections.humans.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
232:       result.gsub(/_id$/, "").gsub(/_/, " ").capitalize
233:     end

Yields a singleton instance of Inflector::Inflections so you can specify additional inflector rules.

Example:

  ActiveSupport::Inflector.inflections do |inflect|
    inflect.uncountable "rails"
  end

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 122
122:     def inflections
123:       if block_given?
124:         yield Inflections.instance
125:       else
126:         Inflections.instance
127:       end
128:     end

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 386
386:     def ordinalize(number)
387:       if (11..13).include?(number.to_i % 100)
388:         "#{number}th"
389:       else
390:         case number.to_i % 10
391:           when 1; "#{number}st"
392:           when 2; "#{number}nd"
393:           when 3; "#{number}rd"
394:           else    "#{number}th"
395:         end
396:       end
397:     end

Replaces special characters in a string so that it may be used as part of a ‘pretty’ URL.

Examples

  class Person
    def to_param
      "#{id}-#{name.parameterize}"
    end
  end

  @person = Person.find(1)
  # => #<Person id: 1, name: "Donald E. Knuth">

  <%= link_to(@person.name, person_path(@person)) %>
  # => <a href="/person/1-donald-e-knuth">Donald E. Knuth</a>

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 259
259:     def parameterize(string, sep = '-')
260:       # replace accented chars with ther ascii equivalents
261:       parameterized_string = transliterate(string)
262:       # Turn unwanted chars into the seperator
263:       parameterized_string.gsub!(/[^a-z0-9\-_\+]+/i, sep)
264:       unless sep.blank?
265:         re_sep = Regexp.escape(sep)
266:         # No more than one of the separator in a row.
267:         parameterized_string.gsub!(/#{re_sep}{2,}/, sep)
268:         # Remove leading/trailing separator.
269:         parameterized_string.gsub!(/^#{re_sep}|#{re_sep}$/i, '')
270:       end
271:       parameterized_string.downcase
272:     end

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 138
138:     def pluralize(word)
139:       result = word.to_s.dup
140: 
141:       if word.empty? || inflections.uncountables.include?(result.downcase)
142:         result
143:       else
144:         inflections.plurals.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
145:         result
146:       end
147:     end

The reverse of pluralize, returns the singular form of a word in a string.

Examples:

  "posts".singularize            # => "post"
  "octopi".singularize           # => "octopus"
  "sheep".singluarize            # => "sheep"
  "word".singularize             # => "word"
  "CamelOctopi".singularize      # => "CamelOctopus"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 157
157:     def singularize(word)
158:       result = word.to_s.dup
159: 
160:       if inflections.uncountables.include?(result.downcase)
161:         result
162:       else
163:         inflections.singulars.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
164:         result
165:       end
166:     end

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 304
304:     def tableize(class_name)
305:       pluralize(underscore(class_name))
306:     end

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"

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 195
195:     def titleize(word)
196:       humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize }
197:     end

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 291
291:       def transliterate(string)
292:         string.mb_chars.normalize(:kd). # Decompose accented characters
293:           gsub(/[^\x00-\x7F]+/, '')     # Remove anything non-ASCII entirely (e.g. diacritics).
294:       end

Replaces accented characters with their ascii equivalents.

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 276
276:     def transliterate(string)
277:       Iconv.iconv('ascii//ignore//translit', 'utf-8', string).to_s
278:     end

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 282
282:       def transliterate(string)
283:         warn "Ruby 1.9 doesn't support Unicode normalization yet"
284:         string.dup
285:       end

The reverse of camelize. 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

[Source]

     # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 206
206:     def underscore(camel_cased_word)
207:       camel_cased_word.to_s.gsub(/::/, '/').
208:         gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
209:         gsub(/([a-z\d])([A-Z])/,'\1_\2').
210:         tr("-", "_").
211:         downcase
212:     end

[Validate]