LoginSignup
1
0

More than 5 years have passed since last update.

Sinatraでルーティングの重複をいい感じにDRYにする方法

Posted at

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以下にアクセスする場合に必ず認証処理を入れるなど、いろいろな使い方ができそうです。

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0