2012-03-19 22 views
5

W przypadku tras Sinatra, w jaki sposób może istnieć zarówno wymagany nazwany parametr, jak i opcjonalnie nazwany parametr w tej samej części trasy.Parametry wymagane i opcjonalne dla trasy Sinatra

Opcjonalny parametr trasa działa dobrze tutaj

get '/widgets.?:format?' 

Ale spróbuj połączyć wymagane nazwie paramter, a rzeczy złamać.

get '/widgets/:id.?:format?' 

Żądania dotyczące /widgets/abc.json przekazują cały abc.json jako parametr id.

Sinatry skompilowany regex to: „”.

/^\/widgets\/([^\/?#]+)(?:\.|%2E)?([^\/?#]+)?$/ 
+1

Dzieje się tak dlatego, że wyrażenie regularne dla dopasowania ': id' jest chciwe, ale dodanie"? "Do reszty powoduje, że są nieuporządkowane. Proszę otworzyć [problem] (https://github.com/sinatra/sinatra/issues/new), być może będę w stanie to naprawić. –

Odpowiedz

2

zrobiłem ominąć wchodząc pełnej regex na trasie i wyłączeniem z pierwszej grupy regex.

get %r{/widgets\/([^\/?#\.]+)(?:\.|%2E)?([^\/?#]+)?} 
+0

Czy otworzyłeś również problem, o który poprosiłeś @Konstantin? Już wcześniej natknąłem się na ten problem (choć nie w Sinatrze) i dobrze byłoby wiedzieć, że został naprawiony w Sinatrze. – iconoclast

Powiązane problemy