在Rails中,如何确定两个URL是否相等?

时间:2012-08-01 13:54:00

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

如果我在Rails中有两个URL,(无论它们是字符串形式还是URI对象),确定它们是否相等的最佳方法是什么?这似乎是一个相当简单的问题,但我需要解决方案才能工作,即使其中一个URL是相对的,另一个是绝对的,或者其中一个URL的参数与另一个不同。

我已经查看了What is the best way in Rails to determine if two (or more) given URLs (as strings or hash options) are equal?(以及其他一些问题),但问题已经过时了,建议的解决方案无法按照我需要的方式运行。

3 个答案:

答案 0 :(得分:4)

如果你有url1和url2是一个包含URL的字符串:

def is_same_controller_and_action?(url1, url2)
  hash_url1 = Rails.application.routes.recognize_path(url1)
  hash_url2 = Rails.application.routes.recognize_path(url2)

  [:controller, :action].each do |key|
    return false if hash_url1[key] != hash_url2[key]
  end

  return true
end

答案 1 :(得分:3)

1)将网址转换为canonical form

在我目前的项目中,我使用addressable gem来做到这一点:

def to_canonical(url)
  uri = Addressable::URI.parse(url)
  uri.scheme = "http" if uri.scheme.blank?
  host = uri.host.sub(/\www\./, '') if uri.host.present?
  path = (uri.path.present? && uri.host.blank?) ? uri.path.sub(/\www\./, '') : uri.path
  uri.scheme.to_s + "://" + host.to_s + path.to_s
rescue Addressable::URI::InvalidURIError
  nil
rescue URI::Error
  nil
end

示例:

> to_canonical('www.example.com') => 'http://example.com'
> to_canonical('http://example.com') => 'http://example.com'

2)比较您的网址: canonical_url1 == canonical_url2

UPD:

  • Does it work with sub-domains? - 不,我的意思是,我们不能说translate.google.comgoogle.com是平等的。当然,您可以根据需要进行修改。

答案 2 :(得分:0)

结帐addressable gem,特别是normalize方法(及其documentation)和heuristic_parse方法(及其documentation)。我过去曾经使用它,发现它非常强大。

可寻址甚至处理包含unicode字符的URL:

uri = Addressable::URI.parse("http://www.詹姆斯.com/")
uri.normalize
#=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>