Capitalize first letter of each word

I am trying to capitalize first letter of each word in a string of
words, which is in a given string. I see there is a reference to this
at:

http://www.java2s.com/Code/Ruby/String/Addtwomethodtostringclasstocapitalizefirstletter.htm

which states to add two method to string class to capitalize first
letter

class String
  def capitalize_first_letter
    self[0].chr.capitalize + self[1, size]
  end

  def capitalize_first_letter!
    unless self[0] == (c = self[0,1].upcase[0])
      self[0] = c
      self
    end
  end
end

My question is, if I create this String class -- what is it? Is it a
model? A helper? Where in the world would you put this creature in a
Rails framework? Thanks, Janna

Well, those two methods won’t give you what you want, if you really want to capitalize the first letter of every word in a sentence. Also, if you just want to capitalize the first letter of the string, the built-in capitalize method will do that for you:

‘some string’.capitalize => ‘Some string’

If you want to capitalize each word in a string, you could do this (a naive approach):

‘some string’.split(’ ‘).map {|w| w.capitalize }.join(’ ')

If you then wanted to make this built-in to the String class, as you were referencing in your original request, you could add a method that does this to the String class by reopening it (like the example you posted):

class String

def cap_words

self.split(’ ‘).map {|w| w.capitalize }.join(’ ')

end

end

You could put this snippet of code in a file in config/initializers or (as my preferred approach would be) in a file in lib (like lib/extensions/string.rb) that is then required via an initializer (like config/initializers/requires.rb): require ‘extensions/string’

Now you have reopened String to add this method. Whether that’s a good idea is another matter entirely. :slight_smile:

I am trying to capitalize first letter of each word in a string of
words, which is in a given string. I see there is a reference to this
at:

String#titleize is your friend...

>> "this is some string. here is another! a question? oh my.".titleize
=> "This Is Some String. Here Is Another! A Question? Oh My."

Indeed… I got wrapped around the axle of re-opening classes in Ruby and forgot to mention the Rails extensions. :slight_smile:

titleize --->>

def titleize(word)
  humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize }
end

output:

"at&t" --> "At&T" (not the desired output)
"man-eater --> "Man Eater" (not the desired output)

"at&t".split(' ').map {|w| w.capitalize }.join(' ') ---> "At&t" seems
to be better approach.