Sinatraを使っていて、ルーティングをカテゴリごとに分けたい場合など、ベタに書くと同じ文字を重複して書いてしまうのが精神衛生上よろしくなかったので対応方法を調べました。
やりたいこと
require 'sinatra'
get '/product/fish' do
'FISH !'
end
get '/product/meat' do
'MEAT !'
end
上記の"/product/"を2箇所もハードコードしているのが大変気持ち悪いのでなんとかしたい。
試したこと(真似してはいけない例)
とりあえずお約束通りハードコードしている文字列を変数に入れてみる。
path_product = '/product'
get "#{path_product}/fish" do
'FISH !!'
end
get "#{path_product}/meat" do
'MEAT !!'
end
やりたいことはできたけどどう見ても美しくない。
というわけでgroupみたいなメソッドがないか調べてみます。
結論:sinatra/namespaceを使おう
Sinatra公式の便利グッズ詰め合わせであるsinatra-contribにちょうど良い感じの機能があるようです。
http://sinatrarb.com/contrib/
まずはsinatra-contribをインストールします。
gem 'sinatra-contrib'
こうすることでsinatraにnamespaceの機能が追加されるので、あとはそれを使って書き換えるだけ。
# sinatra/namespaceを必ずrequireしてください
require 'sinatra/namespace'
namespace '/product' do
get '/fish' do
'FISH !!!'
end
get '/meat' do
'MEAT !!!'
end
end
はい、できました。
泥臭く変数に入れるよりも見た目もスッキリしますね。
またnamespaceごとにbeforeで何か処理をすることもできるので、
例えば/admin以下にアクセスする場合に必ず認証処理を入れるなど、いろいろな使い方ができそうです。