2011-10-04 10 views
5

Jestem początkującym rubinem i próbowałem Sinatry już od pewnego czasu, jedna rzecz, której nie jestem w stanie rozgryźć, to dlaczego "/" w adresie URL robi tak wielką różnicę. Znaczy existing:Sinatra Url '/' interpretacje

get 'some_url' do 
end 

i

get 'some_url/' do 
end 

Podobno wskazują na tej samej trasie? dlaczego Sinatra uważa to za różne drogi? Spędziłem dobrą godzinę, próbując to rozgryźć.

+1

Nie wiem, dlaczego Sinatra uważa to za różne trasy, ale istnieje proste rozwiązanie: 'get% r {some_url \ /?} Do'. Co zaskakujące, nawet to działa: 'get% r {some_url} do'. –

+0

Dziękuję, że nie pomaga – djd

Odpowiedz

2

Zgodnie z dokumentami RFC 2616 i RFC 2396 (dokumenty RFC definiujące tożsamość zasobów) te adresy URL nie definiują tego samego zasobu. Dlatego Sinatra traktuje ich inaczej. To jest esp. ważne, jeśli wyobrazisz sobie trasę zwracającą stronę z względnymi linkami. Ten link

<a href="bar">click me</a> 

wskazywałoby na /bar jeśli idziesz z /foo, aby /foo/bar jeśli idziesz z /foo/.

Można użyć następującej składni, aby określić trasy pasujący zarówno:

get '/foo/?' do 
    # ... 
end 

lub wersji REGEXP mowa w powyższych komentarzach.

2

Są to różne trasy. Drugi to adres URL z rozszerzeniem katalogu ("/"); pierwszy to adres URL bez rozszerzenia. Wiele frameworków (takich jak Rails) zinterpretuje zarówno jako tę samą trasę, jak i dołączenie `/ '(np. Django i Apache mogą być tak skonfigurowane, aby to zrobić), ale technicznie są to różne adresy URL.