Sinatra のルーティングの* と: の違い

フィヨルドブートキャンプの課題としてSinatraを使ったメモアプリの開発に取り組んでいます。 Sinatra のルーティングに使われる:* の理解がいまいちすっきりしなかったのでメモ。

結論

: は名前付きパラメータ、*ワイルドカード

  • : の値はparams['パラメータ名'] で取得できる
  • * の値は[params['splat'] で取得できる
  • ブロック内で値を展開できる
# 名前付きパラメータの値をparams で取得
get '/hello/:name' do
  # get /hello/bob
  "hello,#{params['name']}!" #=> hello,bob! 
end

# 名前付きパラメータの値をブロックで展開
get '/hello/:name' do |n|
  # get hello/marry
  "hello, #{n}!" #=> hello, marry!
end

# ワイルドカードの値をparams['splat'] で取得
get '/say/*/to/*' do
  # get /say/hello/to/world
  "matched #{params['splat']}" #=> matched ["hello", "world"]
end

# ワイルドカードの複数の値をブロックで展開
get '/download/*.*' do |path, ext|
  # get /download/path/to/file.xml
  [path, ext] #=> ["path/to/file", "xml"]
end

通常のルーティングの場合は名前付きパラメータ(:) を使い、パスから複数の値を取得したい場合やワイルドカードを使いたい場合に* を使うと良いのかもしれない。

まとめ

個別のidで投稿やユーザを管理する場合に:* のどちらを使えば良いか理解できたのでスッキリした! Sinatra のドキュメントは1ページにまとまっているので読みやすいが見出し毎にリンクが無いのがちょっと残念。

参照

Sinatra: README (Japanese)