【发布时间】:2011-08-08 20:53:15
【问题描述】:
我在一个 Ruby 程序中有两个 URI。一个肯定是绝对 URI,另一个可能是绝对的或相对的。我想在第一个的上下文中将第二个转换为绝对URI,所以如果第一个是http://pupeno.com/blog,第二个是/about,结果应该是http://pupeno.com/about。有什么想法吗?
【问题讨论】:
我在一个 Ruby 程序中有两个 URI。一个肯定是绝对 URI,另一个可能是绝对的或相对的。我想在第一个的上下文中将第二个转换为绝对URI,所以如果第一个是http://pupeno.com/blog,第二个是/about,结果应该是http://pupeno.com/about。有什么想法吗?
【问题讨论】:
这样就可以了:
require 'uri'
url=URI.parse('http://pupeno.com/blog')
=> #<URI::HTTP:0x00000100e35368 URL:http://pupeno.com/blog>
ruby-1.9.2-p0 > url.path="/about"
=> "/about"
ruby-1.9.2-p0 > url
=> #<URI::HTTP:0x00000100e35368 URL:http://pupeno.com/about>
【讨论】:
Ruby 的内置 URI 和 Addressable gem 都可以轻松解决这个问题。我更喜欢 Addressable,因为它功能更全面,但 URI 是内置的。
require 'uri'
URI.join('http://pupeno.com/blog', '/about') # => #<URI::HTTP:0x00000101098538 URL:http://pupeno.com/about>
或
require 'addressable/uri'
uri = Addressable::URI.parse('http://pupeno.com/blog')
uri.join('/about') # => #<Addressable::URI:0x806704a0 URI:http://pupeno.com/about>
使用提供的join 方法是个好主意,因为它们会进行一些健全性检查以确保返回的地址是健全的。如果您有相对 URL 并简单地替换旧路径,则直接分配给路径可能会破坏事情。 join 将考虑到这一点,并将替换或合并,以适当者为准。
【讨论】: