2012-09-14 79 views
1

我想做一個小的sinatra的例子,將打印日曆視圖爲一個月,一天或一年取決於URL。這樣Sinatra路線參數與RegExp

本地主機:4567 /日曆/ 2012年將打印一年查看日曆

本地主機:4567 /日曆/ 2012/9進行打印月曆

本地主機:4567 /日曆/九分之二千〇一十二/ 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 

我的問題是,我可以進一步細化茨艾倫具有某種RegEx的電子路線,這樣我可以說,只有在月份部分介於1和12之間且day部分介於1和31之間時,url纔會計數?

回答

2

是的。你可以在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 
+0

謝謝,是這個答案意味着複製我的例子嗎?因爲從我可以告訴:主機/ 2012/9返回相同的主機/ 2012/99999和主機/ 2012/9/15。他們都產生了「hello [」2012「,」9「] –

+0

@ChrisValentine在我的舊正則表達式中存在一個缺陷,月份會匹配任何包含1-12的字符串,因此99999會匹配,而'host/2012/9/15 /',應該有另一條路線,比如'%r {/ calendar/[\ d] +/regex_for_month/regex_for_days}' – halfelf

+0

非常感謝,這真的幫助我弄清楚了。知道如何將regex_for_year部分改爲只接受正整數值,截至目前,如果年份爲0,它將起作用。Thx再次。 –

6

如果使用的是紅寶石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