1

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

我已经看过Rails 中确定两个(或多个)给定 URL(作为字符串或哈希选项)是否相等的最佳方法是什么?(以及其他几个问题),但是这个问题已经很老了,建议的解决方案不能按我需要的方式工作。

4

3 回答 3

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
于 2012-08-01T15:00:40.333 回答
3

1) 将 URL 转换为规范形式

在我当前的项目中,我正在使用可寻址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

升级版:

  • Does it work with sub-domains?- 不,我的意思是,我们不能那样说translate.google.com并且google.com是平等的。当然,您可以根据自己的需要进行修改。
于 2012-08-01T14:45:04.920 回答
0

检查可寻址的gem,特别是normalize方法(及其文档)和heuristic_parse方法(及其文档)。我过去使用过它,发现它非常强大。

Addressable 甚至可以处理带有 unicode 字符的 URL:

uri = Addressable::URI.parse("http://www.詹姆斯.com/")
uri.normalize
#=> #<Addressable::URI:0xc9a4c8 URI:http://www.xn--8ws00zhy3a.com/>
于 2012-08-01T14:36:29.043 回答