Rails 2.0のサニタイザーをビューテンプレート以外から使う

Rails 2.0ではビューのヘルパーメソッドとしてsanitizeメソッドなどが追加されました。これはHTMLをパースして、不要なタグや属性なんかを賢く取り除くというものです。

sanitize("<p>hoge</p>") 
  # => <p>hoge</p>

sanitize("<p onclick="alert('foo')">hoge</p>")
  # => <p>hoge</p>

sanitize("<iframe src='http://example.com/foo'></iframe><p>hoge</p>")
  # => <p>hoge</p>

strip_tags("<iframe src='http://example.com/foo'></iframe><p>hoge</p>")
  # => hoge

とても便利なのでビュー以外、例えばモデルのbefore_validatesコールバックやデータ投入スクリプトから使いたい場合には ActionView::Base.white_list_sanitizerメソッドでサニタイザーオブジェクトを持ってきて使います。

ActionView::Base.white_list_sanitizer.sanitize("<p onclick=\"alert('foo')\">hoge</p>")
  # => <p>hoge</p>

それぞれ以下の対応になってるみたいです。

sanitize() ActionView::Base.white_list_sanitizer.sanitize()
sanitize_css() ActionView::Base.white_list_sanitizer.sanitize_css()
strip_tags() ActionView::Base.full_sanitizer.sanitize()
strip_links() ActionView::Base.link_sanitizer.sanitize()

詳しくは actionpack-2.0.2/lib/action_view/helpers/sanitize_helper.rb をどうぞ。

ちなみに当たり前ですが、こうやって取り込んだデータの表示時にはsanitize()メソッドを通さなくてよい、ということではありませんのでご注意。