2012-09-14 3 views
1

URL에 따라 한 달, 하루 또는 한 해 동안 일정보기를 인쇄하는 작은 sinatra 예제를 만들려고합니다. 이러한RegExp로 Sinatra 라우트 매개 변수

로컬 호스트 있음 : 4567/달력/2012 년보기 달력을 인쇄 할

로컬 호스트 : 4567/달력/2012 년/9 월 달력을 인쇄합니다

로컬 호스트 : 4567/달력/9분의 2,012

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 

내 질문은, 내가 더 도스을 구체화 할 수 있습니다 :/15 내가이이로 일하고있는 일보기 달력

를 인쇄합니다 어떤 종류의 RegEx가있는 경로로 : 월 부분이 1에서 12 사이이고 : 일 부분이 1에서 31 사이 인 경우에만 URL을 계산한다고 말할 수 있습니다.

답변

2

예. sinatra 라우팅 조건에서 regex를 지정할 수 있습니다. 자세한 내용은 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 
+0

덕분에,이 대답은 내 예를 복제하는 의미했다? 내가 말할 수있는 것부터 : host/2012/9는 host/2012/99999와 host/2012/9/15를 반환합니다. 그들은 모두 "hello ["2012 ","9 "]를 생성합니다 –

+0

@ChrisValentine 내 오래된 정규 표현식에 결함이있었습니다 .1 월 부분은 1-12를 포함하는 문자열과 일치하므로 99999가 일치하고'host/2012/9/15 /'% r {/ calendar/[\ d] +/regex_for_mon_s/regex_for_days}와 같은 다른 경로가 있어야합니다 ' – halfelf

+0

고마워,이 사실은 내가 알아내는 데 정말로 도움이되었다. regex_for_year 부분을 양의 정수 값만 받아들이는 방법을 알았으니 이제는 년이 0이면 작동 할 것입니다. Thx again. –

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