2016-04-06 3 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. Это не * * указывает на файл, но это помогает думать о пути таким образом. Сегмент пути, который не заканчивается символом '/', традиционно должен быть файлом, поэтому первые два примера заменяют файл '/ foo' файлом'/bar'. Третий добавляет файл 'bar' в каталог'/foo/'. –

Смежные вопросы