LoginSignup
1
0

More than 5 years have passed since last update.

Sinatra 2.0でハマった非互換

Last updated at Posted at 2017-08-16

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
1
0
2

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