私はルビーの初心者であり、かなり長い間Sinatraを試してきました.Iamが理解できないことは、なぜURLの '/'がそのような大きな違いを生むのかです。 私はイマイチ意味:Sinatra Url '/'解釈
get 'some_url' do
end
と
get 'some_url/' do
end
は、同じルートを指すようになって?なぜSinatraはそれを異なるルートと見なしていますか?私はそれを理解しようとしている良い1時間を過ごした。
私はルビーの初心者であり、かなり長い間Sinatraを試してきました.Iamが理解できないことは、なぜURLの '/'がそのような大きな違いを生むのかです。 私はイマイチ意味:Sinatra Url '/'解釈
get 'some_url' do
end
と
get 'some_url/' do
end
は、同じルートを指すようになって?なぜSinatraはそれを異なるルートと見なしていますか?私はそれを理解しようとしている良い1時間を過ごした。
RFC 2616およびRFC 2396(リソースIDを定義するRFC)によれば、これらのURLは同じリソースを定義していません。したがって、シナトラはそれらを別々に扱います。これはespです。相対リンクを持つページを返すルートを想像すると重要です。あなたは/foo
から来ている場合は、/foo/
から来ている場合は、このリンク
<a href="bar">click me</a>
は/foo/bar
に、/bar
を指すでしょう。
get '/foo/?' do
# ...
end
または、上記のコメントで述べた正規表現のバージョン:
あなたは両方に一致するルートを定義するには、次の構文を使用することができます。
これらは異なるルートです。 2番目はディレクトリ拡張子( '/')を持つURLです。最初は拡張子のないURLです。多くのフレームワーク(Railsなど)は、両方を同じルートとして解釈するか、 `/ 'を追加します(DjangoやApacheもそうするように設定できます)が、技術的には異なるURLになります。
Sinatraが異なるルートと見なす理由はわかりませんが、簡単な回避策があります: 'get%r {some_url \ /?} do'。意外にも、これはうまくいきます: 'get%r {some_url} do'。 –
ありがとうございました – djd