Sinatraで自作before_filterを使った場合と使わない場合でコードがどれぐらい変わるか?
もはや誰も望んでいなさそうなSinatraの細かいネタですがねちねちと続けます。
今回は、前回作った自作のbefore_filterを使った場合と、使わずに直接beforeメソッドを使った場合とで、コードがどう変わるか、簡単に比較してみる。
まずは使わない場合から。
before do if request.path_info =~ /^\/admin\// if not login_as_admin? throw :halt, "required admin privilege." end end end
まぁこんなもんかなぁという感じ。個人的には/^\/admin\//という正規表現はあまり読みやすいとは思えないけど、他の部分は特に文句はない。request.path_infoにパス情報が入っているので、それを正規表現でチェックして、フィルタ対象のURLである場合にはさらにadmin権限を持っているかどうかをチェックしている。で、権限がない場合、throw :haltが実行される。throwするとcatchまで処理がすっ飛ぶので、通常のroutingによる処理は全部スキップされ、"required admin privilege."というエラーメッセージが返ることになる。
次に自作のbefore_filterを使った場合。
before_filter '/admin/*' do if login_as_admin? pass else return "required admin privilege." end end
こちらの方が、フィルタ対象となるパスの指定はわかりやすいように感じる。ただ、明示的にpassするようになった分、コード行が増えたようにも感じる。実際には5行で行数は変わらないし、絶対的なタイプ量も微妙に減ってるんだけど…。
before_filterの方がコードはわかりやすいと思うんだけど、果たしてSinatra本体にコードを追加するだけのある価値があるのかどうかはよくわからない。とりあえずもうちょっと手元で使って考えてみる。