hello-world
webエンジニアのメモ。とりあえずやってみる。

[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タグが実行されました。

sinatra1

というわけで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>" %>

この状態だと以下のようにエスケープされます。

sinatra2

さらに追ってみると、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>" %>

参考


Related #sinatra

railsとsinatraの使い分け

sinatraでアプリを作っていたら、色々機能が足りなかったので継ぎ足し継ぎ足しで色々増やしていったら結局railsのようなもの、になってしまいました。

[sinatra].htpasswdを使ったbasic認証をやってみる

sinatraで作っているアプリにbasic認証をかけようと思って調べていたのですが、公式に載っているサンプルだと一組のid、パスワードしか扱えなかったので、.htpasswdを読み込んで使えるようにできないかやってみました。

[sinatra][twitter]screen_nameからユーザidを求めるサンプル

twitterのscreen\_nameを元にユーザidを知りたいと思い調べていたところ、