Sinatra 2.0はoptional parametersの仕様が変更されたようです。
下記の単純なサンプルで確認しました。
require 'sinatra'
get '/:query?' do
(params[:query] || '') + "\n"
end
これを、Sinatra 1.4.8とSinatra 2.0.0で確認します。
Sinatra 1.4.8の場合
$ curl -L http://localhost:4567/
$ curl -L http://localhost:4567/test
test
$ curl -L http://localhost:4567/?query=test
test
$
Sinatra 2.0.0の場合
$ curl -L http://localhost:4567/
$ curl -L http://localhost:4567/test
test
$ curl -L http://localhost:4567/?query=test
$
Sinatra 2.0.0でもSinatra 1.4.8と同じ結果が得られるようにしたのが下記の例です。もっと簡単に書く方法がありましたら教えてください。
require 'sinatra'
pattern =
if Gem::Version.create(Sinatra::VERSION) < Gem::Version.create('2.0.0')
'/:query?'
else
'/(:path)?(\?query=)?'
end
get pattern do
(params[:path] || params[:query] || '') + "\n"
end
追記
@scivola さんにアドバイスいただき、以下のように修正しました。
require 'sinatra'
get %r{/([a-z]+)?} do |query|
(query || params[:query] || '') + "\n"
end
さらに追記
そもそも、クエリー・パラメータとパス・パラメータのどちらでも受け付けるという仕様を見直し、クエリー・パラメータでの問合せはパス・パラメータにリダイレクトさせるよう変更ました。修正後のコードは以下のようになりました。
require 'sinatra'
get '/' do
query = params[:query]
if query.nil?
"\n"
else
redirect "/#{query}", 303
end
end
get '/:query' do
(params[:query] || '') + "\n"
end