1

Railsに2つのURLがある場合(文字列形式かURIオブジェクトかに関係なく)、それらが等しいかどうかを判断するための最良の方法は何ですか?かなり単純な問題のように見えますが、一方のURLが相対的で、もう一方が絶対的である場合、または一方のURLのパラメーターが他方と異なる場合でも、解決策が必要です。

2つ(またはそれ以上)の指定されたURL(文字列またはハッシュオプションとして)が等しいかどうかを判断するためのRailsの最良の方法は何ですか?(および他のいくつかの質問)が、質問はかなり古く、提案された解決策は私が必要とする方法で機能しません。

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 を標準形式に変換する

私の現在のプロジェクトでは、それを行うためにアドレス指定可能な宝石を使用しています:

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) URL を比較します。 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 に答える