2008-09-24 10 views
7

¿Estoy queriendo un método llamado same_url? eso devolverá verdadero si las URL aprobadas son iguales. Las URL aprobadas pueden ser hash de opciones de parámetros o cadenas.¿Cuál es la mejor manera en Rails para determinar si dos (o más) URL dadas (como cadenas o opciones de hash) son iguales?

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

El Marco rieles ayudante current_page? parece un buen punto de partida, pero me gustaría pasar en un número arbitrario de direcciones URL.

Como un beneficio adicional Sería bueno si un hash de parametros para excluir de la comparación podría ser aprobada en Así que una llamada al método podría ser:.

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

Me doy cuenta en su ejemplo que tiene una url de cadena que se pasa, pero aún espera que el parámetro de página termine excluido. Analizaría esto en un hash usando el módulo Routing, y solo trabajaría con hash. – kch

Respuesta

1

¿Es este el tipo de cosas que' re después?

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

Aquí está el método (bung en/lib y lo requiera en 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 

Si usted está en los carriles de pre-2.0.1, también es necesario añadir el método except ayudante en 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 

versión posterior de los carriles (bueno, ActiveSupport) incluyen except ya (crédito: Brian Guthrie)

+0

Las versiones más nuevas de Rails ya poseen el asistente que ha implementado anteriormente (excepto); podría ser redundante volver a agregarlo. –

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 

la que:

  • params_for_urls es un conjunto de valores hash de parámetros de URL (cada entrada de la matriz son parametros para construir una URL)
  • exclude_keys es un conjunto de símbolos de teclas que desea ignorar
  • request.request_uri puede no ser exactamente lo que debe usar, consulte a continuación.

Entonces hay todo tipo de cosas que usted querrá tener en cuenta al implementar su versión:

  • qué quiere comparar la URI completa con el dominio, el puerto y todo, o simplemente ¿el camino?
  • si solo desea la ruta, ¿desea comparar los argumentos que se pasaron después del signo de interrogación o solo aquellos que componen la ruta de acceso real?
Cuestiones relacionadas