2008-09-24 8 views
7

Ich möchte eine Methode namens same_url? das wird wahr zurückgeben, wenn die übergebenen URLs gleich sind. Die übergebenen URLs können entweder params options hash oder strings sein.Was ist der beste Weg in Rails festzustellen, ob zwei (oder mehr) gegebene URLs (als Strings oder Hash-Optionen) gleich sind?

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

Die Rails-Framework Helfer current_page? scheint wie ein guter Ausgangspunkt, aber ich würde in einer beliebigen Anzahl von URLs weitergeben möchten.

Als zusätzliche Bonus, es wäre gut, wenn ein Hash von params aus dem Vergleich ausschließen könnte in weitergegeben wird also ein Methodenaufruf könnte wie folgt aussehen:.

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

Ich merke in Ihrem Beispiel haben Sie eine Zeichenfolge URL übergeben, aber Sie immer noch erwarten, dass der Seitenparameter ausgeschlossen werden. Ich würde dies mit dem Routing-Modul zu einem Hash analysieren und nur mit Hashes arbeiten. – kch

Antwort

1

Ist dies die Art von Sache, die Sie‘ danach?

def same_url?(one, two) 
    url_for(one) == url_for(two) 
end 
5

Hier ist das Verfahren (Spund es in/lib und erfordern es in 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 

Wenn Sie on Rails sind bereits 2.0.1, Sie müssen auch hinzufügen die except Hilfsmethode 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 

spätere Version von Rails (na ja, Active) umfasst except bereits (Kredit: Brian Guthrie)

+0

Neuere Versionen von Rails besitzen bereits den Helfer, den Sie oben implementiert haben (außer); Es könnte überflüssig sein, es erneut hinzuzufügen. –

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 

Wobei:

  • params_for_urls ein Array von Hashes von URL-Parameter ist (jeden Array-Eintrag sind params eine URL zu erstellen)
  • exclude_keys eine Reihe von Symbolen für den Schlüssel ist, dass Sie wollen zu ignorieren
  • request.request_uri möglicherweise nicht genau das, was Sie verwenden sollten, siehe unten.

Dann gibt es alle möglichen Dinge, die Sie wollen, werde, wenn Ihre Version der Umsetzung:

  • tun Sie das volle uri mit Domain, Port vergleichen möchten und alle, oder einfach nur der Weg?
  • Wenn Sie nur den Pfad verwenden, möchten Sie immer noch Argumente vergleichen, die nach dem Fragezeichen übergeben wurden, oder nur solche, die den tatsächlichen Pfadpfad enthalten?