Rails の便利メソッド h, html_escape は ERB:Util にあった

Rails の便利メソッド h, html_escape は ERB:Util にあった

2007/07/01 7:03am

Ruby on Rails のテンプレートでしょっちゅうお世話になる h メソッド。

<& といった、HTML にはそのまま書けない文字を実体参照に置き換えてくれるメソッドだが、これをコントローラーから使いたいときがある。たとえば、Ajax のレスポンスで ad-hoc に HTML 片を返してしまいたいときとか、けっこうあるんじゃないか。

しかし、そのままではコントローラーから使うことはできない。

def update
  render :text => h(params[:value])
end

というか、そもそも API リファレンスにないんですけど…。

ソースコードを調べてみて、やっと分かった。

どうやら、h メソッドは erb の ERB::Util モジュールで定義されているらしい。

actionpack-1.13.3 - lib/action_view/helpers/tag_helper.rb

module ActionView
  module Helpers #:nodoc:
    # Use these methods to generate HTML tags programmatically when you can't use
    # a Builder. By default, they output XHTML compliant tags.
    module TagHelper
      include ERB::Util
      ...

以下は ruby 1.8.6 の erb.rb から

class ERB
  module Util
    public
    def html_escape(s)
      s.to_s.gsub(/&/, "&amp;").gsub(/\"/, """).gsub(/>/, "&gt;").gsub(/</, "&lt;")
    end
    alias h html_escape
    module_function :h
    module_function :html_escape
    ...

というわけで、Rails のコントローラーで h メソッドを使うには以下のようにすればいい。

def update
  render :text => ERB::Util.html_escape(params[:value])
end