1

我正在尝试制作一个小的 sinatra 示例,它将根据 URL 打印一个月、一天或一年的日历视图。这样

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

我的问题是,我是否可以使用某种正则表达式进一步优化这些路由,以便我可以说 URL 仅在 :month 部分在 1 到 12 之间并且 :day 部分在 1 到 31 之间时才有效?

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 自述文件。

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 回答