Sinatraで複数のルーティングにマッチすると先に宣言されたほうで処理が行われるけど、passを使うと次のルーティングに処理が引き渡される。
どのルーティングにマッチするかにはPATH_INFO
が使われている*1ので、pass
する前にこれを書き換えることで全く別のルーティングに処理を引き渡すことができる。
get "/aaa" do request.path_info.gsub!("aaa", "bbb") pass end get "/bbb" do "Welcome to bbb!" end
実際はpath_info
だけでなく、path
とurl
についてもgsub!
を実行しておいたほうが安全そう。
あと、フィルターの実行条件が変わって、before
はpass元(上での"/aaa")の条件で実行されるけど、after
はpass先(上での"/bbb")で実行されるので要注意。
追記
ルーティングの検索はアクセスのあったHTTPメソッド内で行われるので、たとえrequest.request_method
を書き換えたとしても他のメソッドのものに引き渡すことはできない。たとえばGET /aaa
からGET /bbb
はできても、PUT /ccc
はできない。
*1:process_routeを参照