[sinatra]padrino-helpersを使って自動エスケープ
sinatra + active record を使ったアプリを作っていたらいつの間にかviewが自動でエスケープされるようになっていました。
確かsinatraは手動エスケープする必要があったはず、と思い以下のシンプルなアプリを実行してみたところ、
# app.rb
require 'sinatra/base'
module Sample
class App < Sinatra::Base
get '/' do
erb :index
end
end
end
# views/index.erb
<%= "<b>Hello World</b>" %>
やはり、以下のようにエスケープされずにbタグが実行されました。
というわけでsinatra自身が自動エスケープしているのではありませんでした。
そこで、何が自動エスケープしてくれているのか調査してみたところ、ページャ実現のために使用している Kaminari::Helpers::SinatraHelpers の中で自動エスケープ機能が定義されているようでした。
# app.rb
require 'sinatra/base'
require 'padrino-helpers'
require 'kaminari/sinatra'
module Sample
class App < Sinatra::Base
register Kaminari::Helpers::SinatraHelpers
get '/' do
erb :index
end
end
end
# views/index.erb
<%= "<b>Hello World</b>" %>
この状態だと以下のようにエスケープされます。
さらに追ってみると、kaminari/sinatraが依存している、padrino-helpersが自動エスケープ機能を提供してくれていました。
padrino-helpers単体で使用する場合は register Padrino::Helpers を記述します。
require 'sinatra/base'
require 'padrino-helpers'
module Sample
class App < Sinatra::Base
register Padrino::Helpers
get '/' do
erb :test
end
end
end
また、エスケープを解除したい場合は、<%==のように二重イコールを使用します。
<%== "<b>Hello World</b>" %>