Использование File.join
не является надежным, поскольку он будет использовать разделитель файловой системы ОС, который в Windows равен \
вместо /
, теряя переносимость.
Как вы заметили, URI::join
не будет объединять пути с повторяющимися косыми чертами, поэтому не подходит к части.
Оказывается, для этого не требуется много кода на Ruby:
module GluePath
def self.join(*paths, separator: '/')
paths = paths.compact.reject(&:empty?)
last = paths.length - 1
paths.each_with_index.map { |path, index|
_expand(path, index, last, separator)
}.join
end
def self._expand(path, current, last, separator)
if path.start_with?(separator) && current != 0
path = path[1..-1]
end
unless path.end_with?(separator) || current == last
path = [path, separator]
end
path
end
end
Алгоритм обрабатывает последовательные слэши, сохраняет начальный и конечный слэши и игнорирует nil
и пустые строки.
puts GluePath::join('resource/', '/edit', '12?option=test')
выходы * * 1016
resource/edit/12?option=test