Ruby on Rails Tutorial の続き文字列折り返しメソッドが大変よろしくないので修正した

Ruby on Rails Tutorial Learn Rails by Example は大変よろしい教材で重宝しているのだが、Chapter 11 User microposts11.5 Exercises 設問 8 に付記されたコード: Listing 11.42. A helper to wrap long words. が大変よろしくない。

app/helpers/microposts_helper.rb

module MicropostsHelper

  def wrap(content)
    raw(content.split.map{ |s| wrap_long_string(s) }.join(' '))
  end

  private

    def wrap_long_string(text, max_width = 30)
      zero_width_space = "​"
      regex = /.{1,#{max_width}}/
      (text.length < max_width) ? text : 
                                  text.scan(regex).join(zero_width_space)
    end
end

HTML エスケープし忘れでござる。<font color="red">red</font> などを入力して確認。

module MicropostsHelper

  def wrap(content)
    raw(content.split.map{ |s| wrap_long_string(s) }.join(' '))
  end

  private

    def wrap_long_string(text, max_width = 30)
      zero_width_space = "&#8203;"
      regex = /.{1,#{max_width}}/
      (text.length < max_width) ? h(text) : 
                                  text.scan(regex).map{|t| h(t) }.join(zero_width_space)
    end
end

これでいいはず。一応メール送っといた。みんなも raw を使うときは気を付けようね。


追記:
メールしたら、"The escaping using 'h' should be unnecessary in Rails 3." とか寝言言ってたので、「Rails 3 でも "raw" メソッドを使ったときは、エスケープしなといけない。」というようなことを書いて返信した。


追記:


とあるので、Book の方は修正されたみたい。メールでは "sanitize" 使ったって書いてあった。Web はまだ修正されてないみたい。


追記:
修正された。全体を sanitize() で囲ってある。これだと、タグが問答無用で削除されるんだが、まぁいいか。サンプルアプリだし。