2011-10-04 8 views
5

私はルビーの初心者であり、かなり長い間Sinatraを試してきました.Iamが理解できないことは、なぜURLの '/'がそのような大きな違いを生むのかです。 私はイマイチ意味:Sinatra Url '/'解釈

get 'some_url' do 
end 

get 'some_url/' do 
end 

は、同じルートを指すようになって?なぜSinatraはそれを異なるルートと見なしていますか?私はそれを理解しようとしている良い1時間を過ごした。

+1

Sinatraが異なるルートと見なす理由はわかりませんが、簡単な回避策があります: 'get%r {some_url \ /?} do'。意外にも、これはうまくいきます: 'get%r {some_url} do'。 –

+0

ありがとうございました – djd

答えて

2

RFC 2616およびRFC 2396(リソースIDを定義するRFC)によれば、これらのURLは同じリソースを定義していません。したがって、シナトラはそれらを別々に扱います。これはespです。相対リンクを持つページを返すルートを想像すると重要です。あなたは/fooから来ている場合は、/foo/から来ている場合は、このリンク

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

/foo/barに、/barを指すでしょう。

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

または、上記のコメントで述べた正規表現のバージョン:

あなたは両方に一致するルートを定義するには、次の構文を使用することができます。

2

これらは異なるルートです。 2番目はディレクトリ拡張子( '/')を持つURLです。最初は拡張子のないURLです。多くのフレームワーク(Railsなど)は、両方を同じルートとして解釈するか、 `/ 'を追加します(DjangoやApacheもそうするように設定できます)が、技術的には異なるURLになります。