1

URLに応じて、月、日、または年のいずれかのカレンダービューを印刷する小さなsinatraの例を作成しようとしています. そのような

localhost:4567/calendar/2012 は年ビューのカレンダーを出力します

localhost:4567/calendar/2012/9 は月のカレンダーを出力します

localhost:4567/calendar/2012/9/15 は、日表示のカレンダーを出力します

私はこれを次のように機能させています:

require 'sinatra'

get '/calendar/:year/:month/:day/?' do
    "printing daily calendar for #{params[:year]}/#{params[:month]}/#{params[:day]}"
end

get '/calendar/:year/:month/?' do
    "printing monthly calendar for #{params[:year]}/#{params[:month]}"
end

get '/calendar/:year/?' do
    "printing yearly calendar for #{params[:year]}"
end

私の質問は、:month 部分が 1 から 12 の間で、:day 部分が 1 から 31 の間である場合にのみ URL がカウントされると言えるように、ある種の RegEx を使用してこれらのルートをさらに絞り込むことはできますか?

4

2 に答える 2

7

Ruby 1.9 以降を使用している場合は、次のような名前付きキャプチャを使用できます。

get %r{/(?<year>\d{4})/(?<month>\d{2})/(?<day>\d{2})/?} do
 "printing daily calendar for #{params[:year]}/#{params[:month]}/#{params[:day]}"
end

get %r{/(?<year>\d{4})/(?<month>\d{2})/?} do
  "printing monthly calendar for #{params[:year]}/#{params[:month]}"
end

get %r{/(?<year>\d{4})/?} do
  "printing monthly calendar for #{params[:year]}"
end
于 2014-11-05T04:41:39.950 に答える
2

はい。sinatra ルーティング条件で正規表現を指定できます。詳細については、 sinatra の readmeを参照してください。

get %r{/calendar/([\d]+)/(1[0-2]|0?[1-9])/([12][0-9]|3[0-1]|0?[1-9])$} do 
  "hello #{params[:captures]}"
end

get %r{/calendar/([\d]+)/(1[0-2]|0?[1-9])$} do 
  "hello #{params[:captures]}"        
end

# host/2012/11 will print "hello [2012, 11]"
# params[:captures] will return an array containing what match the regular expressions
于 2012-09-14T04:48:30.200 に答える