2016-04-06 18 views
0

URI::joinは、/がない限り、引数に/文字をすべて削除します。例えば:URI.joinで予期しない動作が発生する

URI::join("http://www.example.com/prefix", "some_path").to_s 
#=> "http://www.example.com/some_path" 

URI::join("http://www.example.com/prefix/", "some_path").to_s 
#=> "http://www.example.com/prefix/some_path" 

は、その背後にある理由は何ですか、そしてどのように我々は、(File.joinとして)そのシナリオで使用されることを意味しないツールに依存することなく、これを処理することになっていますか?どちらのタイプの値もベースURLに使用する必要があります。 (やや使用セクションに隠されたとはいえ)

+1

再生できません。 – sawa

+0

ルビーのバージョンは? – Codebeef

+1

私は2.2.0p0、2.1.5p273、1.9.3-p392 – Jesuspc

答えて

2

これが予想され、documented behavior

p URI.join('http://example.com', '/foo', '/bar') 
# => #<URI::HTTP:0x01aaf0b0 URL:http://example.com/bar> 

p URI.join('http://example.com', '/foo', 'bar') 
# => #<URI::HTTP:0x801a92af0 URL:http://example.com/bar> 

p URI.join('http://example.com', '/foo/', 'bar') 
# => #<URI::HTTP:0x80135a3a0 URL:http://example.com/foo/bar> 

あなたのパスフラグメントは、常にスラッシュとの完全なパス断片であることを確認することで、それを処理することができます両側に。

+0

でそれを再現しました。期待はしていますが、うーん。文書化された、うーん。驚くべき、はい。 – Axe

+0

それでも私には意味をなさない:S – Jesuspc

+1

"あなたは、パスフラグメントが常に両側にスラッシュ付きの完全なパスフラグメントであることを確認することで対応できます。キーです。パスセグメントの末尾の '/'は、URLが指すことができるファイルへのパスを扱っている場合、segmentがディレクトリであることを示しています。ファイルを指す* *はありませんが、そのようにパスを考えるのに役立ちます。 '/'で終わらないパスのセグメントは伝統的にファイルであるため、最初の2つの例は '/ foo'ファイルを'/bar'ファイルで置き換えます。 3番目のオプションは 'bar'ファイルを'/foo/'ディレクトリに追加します。 –

関連する問題