Ruby on Rails Tutorial の続き文字列折り返しメソッドが大変よろしくないので修正した
Ruby on Rails Tutorial Learn Rails by Example は大変よろしい教材で重宝しているのだが、Chapter 11 User microposts の 11.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 = "​" 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" メソッドを使ったときは、エスケープしなといけない。」というようなことを書いて返信した。
追記:
@babie Thanks! I just sent you email. It's fixed!
2011-02-19 12:52:20 via TweetDeck to @babie
とあるので、Book の方は修正されたみたい。メールでは "sanitize" 使ったって書いてあった。Web はまだ修正されてないみたい。
追記:
修正された。全体を sanitize() で囲ってある。これだと、タグが問答無用で削除されるんだが、まぁいいか。サンプルアプリだし。