ruby-on-rails - rails - ha*ash perdón, perdón
¿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? (3)
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.
same_url?({:controller => :foo, :action => :bar}, "http://www.example.com/foo/bar") # => true
¿El ayudante de Rails Framework es current_page? parece ser un buen punto de partida, pero me gustaría pasar un número arbitrario de URL.
Como un bono adicional Sería bueno si se pudiera pasar un hash de params para excluir de la comparación. Por lo tanto, una llamada a un método podría verse así:
same_url?(projects_path(:page => 2), "projects?page=3", :excluding => :page) # => true
¿Es este el tipo de cosa que buscas?
def same_url?(one, two)
url_for(one) == url_for(two)
end
Este es el método (bung it in / lib y requiérelo 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 está en Rails pre-2.0.1 , también necesita agregar el método except
helper a 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
La versión posterior de Rails (bueno, ActiveSupport) incluye, except
ya (crédito: Brian Guthrie )
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
Donde:
-
params_for_urls
es una matriz de valores hash de parámetros url (cada entrada de matriz son params para construir una url) -
exclude_keys
es una matriz de símbolos para las claves que desea ignorar -
request.request_uri
puede no ser exactamente lo que debe usar, vea a continuación.
Luego, hay todo tipo de cosas que querrás considerar al implementar tu versión:
- ¿Quieres comparar el uri completo con dominio, puerto y todo, o solo el camino?
- si solo es la ruta, ¿desea comparar los argumentos aprobados después del signo de interrogación o solo aquellos que componen la ruta real?