sinatraに登録されたパスの一覧を取得する

なるべく短くてかっこいいURLでれすとふるにデータにアクセスできるようにしたいけど、既にアプリ内で登録されているパスとぶつかったら嫌じゃないですか。具体的にはlogoutとかhotentryみたいなユーザ名を作らせない、という処理を作りたい。


というわけで、sinatraでブロックに関連付けられたhttp request pathの一覧をとる。

sinatra/base.rbにroutesという読み取り用アクセサが定義されてた。


sinatraアプリ内で

require 'pp'
pp Sinatra::Application.routes['GET'].map{|i|i.first}

するとGETに関連付けられたパス名が手に入る。正規表現になってた。

[/^\/check_route$/,
 /^\/add$/,
 /^\/$/,
 /^\/(.*?)\/show$/,
 /^\/(.*?)\/delete$/,
 /^\/(.*?)$/]


で、名前を指定してデータを登録するアプリを作っているんだけど、
GETで /名前 でアクセスできるようにしたい。
でも、DBに値をいれる前に、既にsinatraで使ってるpathにぶつかる名前でないか確認しておきたい。
既にpathが登録されてるかをチェックする。

def routed?(path)
  Sinatra::Application.routes['GET'].map{|i|i.first}.each{|i|
    next if i.to_s == /^\/(.*?)$/.to_s
    return true if path =~ i
  }
  return false
end

post '/add' do
  name = params['name']
  if routed?("/#{name}")
    # sinatraに登録済みのパスと衝突している
  else
    # DBに保存する
  end
end

get '/*' do
  # /名前でアクセスしてきた時の処理
end

こんなかんじでやれた