西山和広です。

末尾の / の除去は sub(%r</\z>, '') よりも chomp('/') の方が
良いのではないでしょうか?

% cat b.rb
require 'benchmark'
n=100000; s0="hoge"; s1="ho/ge"; s2="hoge/"
Benchmark.bmbm {|bm|
  bm.report('s0.sub') { n.times { s0.sub(%r</\z>, '') } }
  bm.report('s1.sub') { n.times { s1.sub(%r</\z>, '') } }
  bm.report('s2.sub') { n.times { s2.sub(%r</\z>, '') } }
  bm.report('s0.chomp') { n.times { s0.chomp('/') } }
  bm.report('s1.chomp') { n.times { s1.chomp('/') } }
  bm.report('s2.chomp') { n.times { s2.chomp('/') } }
}
% ruby18 -v b.rb
ruby 1.8.1 (2003-12-12) [i686-linux]
Rehearsal --------------------------------------------
s0.sub     0.180000   0.000000   0.180000 (  0.175776)
s1.sub     0.200000   0.000000   0.200000 (  0.230065)
s2.sub     0.260000   0.000000   0.260000 (  0.273504)
s0.chomp   0.140000   0.000000   0.140000 (  0.139400)
s1.chomp   0.140000   0.000000   0.140000 (  0.138558)
s2.chomp   0.180000   0.000000   0.180000 (  0.184558)
----------------------------------- total: 1.100000sec

               user     system      total        real
s0.sub     0.190000   0.000000   0.190000 (  0.192108)
s1.sub     0.200000   0.000000   0.200000 (  0.223766)
s2.sub     0.250000   0.000000   0.250000 (  0.255520)
s0.chomp   0.150000   0.000000   0.150000 (  0.163389)
s1.chomp   0.140000   0.000000   0.140000 (  0.142650)
s2.chomp   0.200000   0.000000   0.200000 (  0.191258)
%

-- 
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)