relaciones rails perdón modelos ruby-on-rails ruby url routes

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?