Rails の便利メソッド h, html_escape は ERB:Util にあった
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(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<")
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