使用File.join
因爲我不健壯t將使用操作系統文件系統分隔符,它在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.starts_with?(separator) && current != 0
path = path[1..-1]
end
unless path.ends_with?(separator) || current == last
path = [path, separator]
end
path
end
end
該算法採用連續斜線的護理,保持開始和結束斜線,而忽略nil
和空字符串。
puts GluePath::join('resource/', '/edit', '12?option=test')
輸出
resource/edit/12?option=test
「的東西看起來不正確有關使用文件庫網址爲」,這是正確的。 'File.join'對操作系統很敏感,並且會根據操作系統改變用作分隔符的字符。那會給你帶來不好的結果。 – 2012-01-17 22:13:46