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
こんなかんじでやれた