class String

def acts_like_string?

Enable more predictable duck-typing on String-like classes. See Object#acts_like?.
def acts_like_string?
  true
end

def as_json(options = nil) self end #:nodoc:

:nodoc:
def as_json(options = nil) self end #:nodoc:

def at(position)

"hello".at(10) # => ERROR if < 1.9, nil in 1.9
"hello".at(4) # => "o"
"hello".at(0) # => "h"
Examples:

Returns the character at the +position+ treating the string as an array (where 0 is the first character).
def at(position)
  mb_chars[position, 1].to_s
end

def at(position)

def at(position)
  self[position]
end

def blank?


" something here ".blank? # => false
" ".blank? # => true
" ".blank? # => true
"".blank? # => true

A string is blank if it's empty or contains whitespaces only:
def blank?
  # 1.8 does not takes [:space:] properly
  if encoding_aware?
    self !~ /[^[:space:]]/
  else
    self !~ NON_WHITESPACE_REGEXP
  end
end

def camelize(first_letter = :upper)

"active_record/errors".camelize(:lower) # => "activeRecord::Errors"
"active_record/errors".camelize # => "ActiveRecord::Errors"
"active_record".camelize(:lower) # => "activeRecord"
"active_record".camelize # => "ActiveRecord"

+camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.

is set to :lower then camelize produces lowerCamelCase.
By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize
def camelize(first_letter = :upper)
  case first_letter
    when :upper then ActiveSupport::Inflector.camelize(self, true)
    when :lower then ActiveSupport::Inflector.camelize(self, false)
  end
end

def classify

"business".classify # => "Busines"

Singular names are not handled correctly.

"posts".classify # => "Post"
"egg_and_hams".classify # => "EggAndHam"

follow +classify+ with +constantize+.)
Note that this returns a string and not a class. (To convert to an actual class
Create a class name from a plural table name like Rails does for table names to models.
def classify
  ActiveSupport::Inflector.classify(self)
end

def constantize

"blargle".constantize # => NameError: wrong constant name blargle
"Class".constantize # => Class
"Module".constantize # => Module
Examples

or is not initialized. See ActiveSupport::Inflector.constantize
in the string. It raises a NameError when the name is not in CamelCase
+constantize+ tries to find a declared constant with the name specified
def constantize
  ActiveSupport::Inflector.constantize(self)
end

def dasherize

"puni_puni" # => "puni-puni"

Replaces underscores with dashes in the string.
def dasherize
  ActiveSupport::Inflector.dasherize(self)
end

def deconstantize

See also +demodulize+.

"".deconstantize # => ""
"::String".deconstantize # => ""
"String".deconstantize # => ""
"::Net::HTTP".deconstantize # => "::Net"
"Net::HTTP".deconstantize # => "Net"

Removes the rightmost segment from the constant expression in the string.
def deconstantize
  ActiveSupport::Inflector.deconstantize(self)
end

def demodulize

See also +deconstantize+.

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

Removes the module part from the constant expression in the string.
def demodulize
  ActiveSupport::Inflector.demodulize(self)
end

def encode_json(encoder) encoder.escape(self) end #:nodoc:

:nodoc:
:nodoc:
def encode_json(encoder) encoder.escape(self) end #:nodoc:

def encoding_aware?

def encoding_aware?
  true
end

def encoding_aware?

def encoding_aware?
  false
end

def exclude?(string)

"hello".exclude? ?h #=> false
"hello".exclude? "ol" #=> true
"hello".exclude? "lo" #=> false

does not include the other string.
The inverse of String#include?. Returns true if the string
def exclude?(string)
  !include?(string)
end

def first(limit = 1)

"hello".first(10) # => "hello"
"hello".first(2) # => "he"
"hello".first # => "h"
Examples:

Returns the first character of the string or the first +limit+ characters.
def first(limit = 1)
  if limit == 0
    ''
  elsif limit >= size
    self
  else
    mb_chars[0...limit].to_s
  end
end

def first(limit = 1)

def first(limit = 1)
  if limit == 0
    ''
  elsif limit >= size
    self
  else
    to(limit - 1)
  end
end

def foreign_key(separate_class_name_and_id_with_underscore = true)

"Admin::Post".foreign_key # => "post_id"
"Message".foreign_key(false) # => "messageid"
"Message".foreign_key # => "message_id"
Examples

the method should put '_' between the name and 'id'.
+separate_class_name_and_id_with_underscore+ sets whether
Creates a foreign key name from a class name.
def foreign_key(separate_class_name_and_id_with_underscore = true)
  ActiveSupport::Inflector.foreign_key(self, separate_class_name_and_id_with_underscore)
end

def from(position)

"hello".from(10) # => "" if < 1.9, nil in 1.9
"hello".from(2) # => "llo"
"hello".from(0) # => "hello"
Examples:

Returns the remaining of the string from the +position+ treating the string as an array (where 0 is the first character).
def from(position)
  mb_chars[position..-1].to_s
end

def from(position)

def from(position)
  self[position..-1]
end

def html_safe

def html_safe
  ActiveSupport::SafeBuffer.new(self)
end

def humanize

"author_id" # => "Author"
"employee_salary" # => "Employee salary"

Like +titleize+, this is meant for creating pretty output.
Capitalizes the first word, turns underscores into spaces, and strips '_id'.
def humanize
  ActiveSupport::Inflector.humanize(self)
end

def inquiry

env.development? # => false
env.production? # => true
env = "production".inquiry

which gives you a prettier way to test for equality. Example:
Wraps the current string in the ActiveSupport::StringInquirer class,
def inquiry
  ActiveSupport::StringInquirer.new(self)
end

def is_utf8?

def is_utf8?
  case encoding
  when Encoding::UTF_8
    valid_encoding?
  when Encoding::ASCII_8BIT, Encoding::US_ASCII
    dup.force_encoding(Encoding::UTF_8).valid_encoding?
  else
    false
  end
end

def is_utf8?

them), returns false otherwise.
Returns true if the string has UTF-8 semantics (a String used for purely byte resources is unlikely to have
def is_utf8?
  ActiveSupport::Multibyte::Chars.consumes?(self)
end

def last(limit = 1)

"hello".last(10) # => "hello"
"hello".last(2) # => "lo"
"hello".last # => "o"
Examples:

Returns the last character of the string or the last +limit+ characters.
def last(limit = 1)
  if limit == 0
    ''
  elsif limit >= size
    self
  else
    mb_chars[(-limit)..-1].to_s
  end
end

def last(limit = 1)

def last(limit = 1)
  if limit == 0
    ''
  elsif limit >= size
    self
  else
    from(-limit)
  end
end

def mb_chars

information about how to change the default Multibyte behavior see ActiveSupport::Multibyte.
For more information about the methods defined on the Chars proxy see ActiveSupport::Multibyte::Chars. For

object. Interoperability problems can be resolved easily with a +to_s+ call.
String and Char work like expected. The bang! methods change the internal string representation in the Chars
The Chars object tries to be as interchangeable with String objects as possible: sorting and comparing between

== Interoperability and configuration

name.mb_chars.reverse.length # => 12

method chaining on the result of any of these methods.
All the methods on the Chars proxy which normally return a string will return a Chars object. This allows

== Method chaining

it becomes easy to run one version of your code on multiple Ruby versions.
In Ruby 1.9 and newer +mb_chars+ returns +self+ because String is (mostly) encoding aware. This means that

name.mb_chars.length # => 12
name.mb_chars.reverse.to_s # => "rellüM sualC"

name.length # => 13
name.reverse # => "rell??M sualC"
name = 'Claus Müller'

class. If the proxy class doesn't respond to a certain method, it's forwarded to the encapsulated string.
encapsulates the original string. A Unicode safe version of all the String methods are defined on this proxy
In Ruby 1.8 and older it creates and returns an instance of the ActiveSupport::Multibyte::Chars class which

+mb_chars+ is a multibyte safe proxy for string methods.

== Multibyte proxy
def mb_chars
  if ActiveSupport::Multibyte.proxy_class.consumes?(self)
    ActiveSupport::Multibyte.proxy_class.new(self)
  else
    self
  end
end

def mb_chars

def mb_chars
  if ActiveSupport::Multibyte.proxy_class.wants?(self)
    ActiveSupport::Multibyte.proxy_class.new(self)
  else
    self
  end
end

def ord

bogus.
not an error, because UTF8 is unsupported, the call itself would be
call +ord+ on the UTF8 string "à" the return value will be 195. That is
bytes, namely 195 and 160, but its Unicode codepoint is 224. If we
represented as a single byte, 224. In UTF8 it is represented with two
Note that the 224 is different in both examples. In ISO-8859-1 "à" is

"à".mb_chars.ord # => 224, in UTF8
"a".mb_chars.ord # => 97

Ruby 1.9 on UTF8 strings:
ActiveSupport::Multibyte::Chars#ord is forward compatible with

these character encodings.
This method is defined in Ruby 1.8 for Ruby 1.9 forward compatibility on

"à".ord # => 224, in ISO-8859-1
"a".ord # => 97

single-byte character encoding:
Returns the codepoint of the first character of the string, assuming a
def ord
  self[0]
end unless method_defined?(:ord)

def parameterize(sep = '-')

# => Donald E. Knuth
<%= link_to(@person.name, person_path) %>

# => #
@person = Person.find(1)

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

==== Examples

Replaces special characters in a string so that it may be used as part of a 'pretty' URL.
def parameterize(sep = '-')
  ActiveSupport::Inflector.parameterize(self, sep)
end

def pluralize(count = nil)

"apple".pluralize(2) # => "apples"
"apple".pluralize(1) # => "apple"
"CamelOctopus".pluralize # => "CamelOctopi"
"the blue mailman".pluralize # => "the blue mailmen"
"words".pluralize # => "words"
"sheep".pluralize # => "sheep"
"octopus".pluralize # => "octopi"
"post".pluralize # => "posts"
==== Examples

For any other value of +count+ the plural will be returned.
the singular form will be returned if count == 1.
If the optional parameter +count+ is specified,

Returns the plural form of the word in the string.
def pluralize(count = nil)
  if count == 1
    self
  else
    ActiveSupport::Inflector.pluralize(self)
  end
end

def safe_constantize

"blargle".safe_constantize # => nil
"Class".safe_constantize # => Class
"Module".safe_constantize # => Module
Examples

or is not initialized. See ActiveSupport::Inflector.safe_constantize
in the string. It returns nil when the name is not in CamelCase
+safe_constantize+ tries to find a declared constant with the name specified
def safe_constantize
  ActiveSupport::Inflector.safe_constantize(self)
end

def singularize

"CamelOctopi".singularize # => "CamelOctopus"
"the blue mailmen".singularize # => "the blue mailman"
"word".singularize # => "word"
"sheep".singularize # => "sheep"
"octopi".singularize # => "octopus"
"posts".singularize # => "post"

The reverse of +pluralize+, returns the singular form of a word in a string.
def singularize
  ActiveSupport::Inflector.singularize(self)
end

def squish

" foo bar \n \t boo".squish # => "foo bar boo"
string }.squish # => "Multi-line string"
%{ Multi-line
Examples:

groups into one space each.
the string, and then changing remaining consecutive whitespace
Returns the string, first removing all whitespace on both ends of
def squish
  dup.squish!
end

def squish!

Performs a destructive squish. See String#squish.
def squish!
  strip!
  gsub!(/\s+/, ' ')
  self
end

def strip_heredoc

that amount of leading whitespace.
Technically, it looks for the least indented line in the whole string, and removes

the user would see the usage message aligned against the left margin.

end
USAGE
...
-h This message
Supported options are:

This command does such and such.
puts <<-USAGE.strip_heredoc
if options[:usage]

For example in

Strips indentation in heredocs.
def strip_heredoc
  indent = scan(/^[ \t]*(?=\S)/).min.try(:size) || 0
  gsub(/^[ \t]{#{indent}}/, '')
end

def tableize

"fancyCategory".tableize # => "fancy_categories"
"egg_and_ham".tableize # => "egg_and_hams"
"RawScaledScorer".tableize # => "raw_scaled_scorers"

uses the +pluralize+ method on the last word in the string.
Creates the name of a table like Rails does for models to table names. This method
def tableize
  ActiveSupport::Inflector.tableize(self)
end

def titleize

"x-men: the last stand".titleize # => "X Men: The Last Stand"
"man from the boondocks".titleize # => "Man From The Boondocks"

+titleize+ is also aliased as +titlecase+.

used in the Rails internals.
a nicer looking title. +titleize+ is meant for creating pretty output. It is not
Capitalizes all the words and replaces some characters in the string to create
def titleize
  ActiveSupport::Inflector.titleize(self)
end

def to(position)

"hello".to(10) # => "hello"
"hello".to(2) # => "hel"
"hello".to(0) # => "h"
Examples:

Returns the beginning of the string up to the +position+ treating the string as an array (where 0 is the first character).
def to(position)
  mb_chars[0..position].to_s
end

def to(position)

def to(position)
  self[0..position]
end

def to_date

"12/13/2012".to_date #=> ArgumentError: invalid date
"2012-12-13".to_date #=> Thu, 13 Dec 2012
"01/01/2012".to_date #=> Sun, 01 Jan 2012
"1-1-2012".to_date #=> Sun, 01 Jan 2012

Converts a string to a Date value.
def to_date
  return nil if self.blank?
  ::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
end

def to_datetime

"12/13/2012".to_datetime #=> ArgumentError: invalid date
"2012-12-13 12:50".to_datetime #=> Thu, 13 Dec 2012 12:50:00 +0000
"01/01/2012 23:59:59".to_datetime #=> Sun, 01 Jan 2012 23:59:59 +0000
"1-1-2012".to_datetime #=> Sun, 01 Jan 2012 00:00:00 +0000

Converts a string to a DateTime value.
def to_datetime
  return nil if self.blank?
  d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :sec_fraction).map { |arg| arg || 0 }
  d[5] += d.pop
  ::DateTime.civil(*d)
end

def to_time(form = :utc)

Form can be either :utc (default) or :local.
def to_time(form = :utc)
  return nil if self.blank?
  d = ::Date._parse(self, false).values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction, :offset).map { |arg| arg || 0 }
  d[6] *= 1000000
  ::Time.send("#{form}_time", *d[0..6]) - d[7]
end

def truncate(length, options = {})

# => "And they f... (continued)"
"And they found that many people were sleeping better.".truncate(25, :omission => "... (continued)")

for a total length not exceeding :length:
The last characters will be replaced with the :omission string (defaults to "...")

# => "Once upon a time in a..."
"Once upon a time in a world far far away".truncate(27, :separator => ' ')

Pass a :separator to truncate +text+ at a natural break:

# => "Once upon a time in a wo..."
"Once upon a time in a world far far away".truncate(27)

Truncates a given +text+ after a given length if +text+ is longer than length:
def truncate(length, options = {})
  text = self.dup
  options[:omission] ||= "..."
  length_with_room_for_omission = length - options[:omission].mb_chars.length
  chars = text.mb_chars
  stop = options[:separator] ?
    (chars.rindex(options[:separator].mb_chars, length_with_room_for_omission) || length_with_room_for_omission) : length_with_room_for_omission
  (chars.length > length ? chars[0...stop] + options[:omission] : text).to_s
end

def underscore

"ActiveModel::Errors".underscore # => "active_model/errors"
"ActiveModel".underscore # => "active_model"

+underscore+ will also change '::' to '/' to convert namespaces to paths.

The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
def underscore
  ActiveSupport::Inflector.underscore(self)
end