N文字目だけ文字を変更する場合には、String#[]とObject#instance_evalが使えます。
例えば行頭だけ変えたい場合はこうします。
"hoge".instance_eval {|i| p i[0].upcase + i[1..-1]} #=>"Hoge"
みんな大好きactive_supportを使うと、もう少し綺麗にかけます
require "active_support/core_ext" "hoge".instance_eval {|i| i.first.upcase + i.from(1) } #=>"Hoge"
単に先頭だけなら
require "active_support/core_ext" 'hoge'.humanize #=> "Hoge"
という手もあります。
末尾なら、
"hoge".instance_eval {|i| i[0..-2] + i[-1].upcase} #=> "hogE"
あるいは
require "active_support/core_ext" "hoge".instance_eval {|i| i.to(-2) + i.last.upcase} => "hogE"
これがN番目となると、
配列にしてぐるぐる回す方法か
"hogefugapiyo".split("").each_with_index{|i,j| i.upcase! if j == 3}.join("") #=> "hogEfugapiyo"
場所と前後を泥臭く指定する方法くらいしか考えつきません(白目
"hogehugapiyo".instance_eval {|o| o[0..2] + o[3].upcase + o[4..-1] } => "hogEhugapiyo"
#=> 10/12追記: 単にformatを使ってやればいいのでは疑惑が出たので記事執筆中