7

same_url というメソッドが必要ですか? 渡された URL が等しい場合は true を返します。渡される URL は、params オプション ハッシュまたは文字列のいずれかです。

same_url?({:controller => :foo, :action => :bar}, "http://www.example.com/foo/bar") # => true

Rails Framework ヘルパーcurrent_page? 良い出発点のように思えますが、任意の数の URL を渡したいと思います。

追加のボーナスとして、比較から除外するパラメーターのハッシュを渡すことができれば良いでしょう。したがって、メソッド呼び出しは次のようになります。

same_url?(projects_path(:page => 2), "projects?page=3", :excluding => :page) # => true 
4

3 に答える 3

5

メソッドは次のとおりです (/lib でバングし、environment.rb でそれを必要とします):

def same_page?(a, b, params_to_exclude = {})
  if a.respond_to?(:except) && b.respond_to?(:except)
    url_for(a.except(params_to_exclude)) == url_for(b.except(params_to_exclude))
  else
    url_for(a) == url_for(b)
  end
end

Rails pre-2.0.1 を使用している場合はexcept、Hash にヘルパー メソッドを追加する必要もあります。

class Hash
  # Usage { :a => 1, :b => 2, :c => 3}.except(:a) -> { :b => 2, :c => 3}
  def except(*keys)
    self.reject { |k,v|
      keys.include? k.to_sym
    }
  end
end

Rails の新しいバージョン (つまり、ActiveSupport) にはexcept既に含まれています (クレジット: Brian Guthrie )

于 2008-09-24T12:25:41.400 に答える
1

これはあなたが求めているようなものですか?

def same_url?(one, two)
  url_for(one) == url_for(two)
end
于 2008-09-24T11:55:31.083 に答える
0
def all_urls_same_as_current? *params_for_urls
  params_for_urls.map do |a_url_hash| 
    url_for a_url_hash.except(*exclude_keys)
  end.all? do |a_url_str|
    a_url_str == request.request_uri
  end
end

ここで:

  • params_for_urlsはURLパラメータのハッシュの配列です(各配列エントリはURLを構築するためのパラメータです)
  • exclude_keys無視したいキーの記号の配列です
  • request.request_uri正確に使用すべきものではない場合があります。以下を参照してください。

次に、バージョンを実装するときに考慮したいあらゆる種類の事項があります。

  • 完全なuriをドメイン、ポート、すべて、またはパスだけと比較しますか?
  • パスだけの場合でも、疑問符の後に渡された引数を比較しますか、それとも実際のパスパスを構成する引数だけを比較しますか?
于 2009-03-15T23:48:21.753 に答える