Ruby on Rails: Enrutamiento para una jerarquía de árbol de lugares
-
11-09-2019 - |
Pregunta
Así que tenemos un sistema heredado que rastrea lugares con identificaciones como "Europa / Francia / Paris", y yo estoy construyendo una fachada rieles de convertir esto en URL como http: // foobar / lugares / Europa / Francia /París. Este requisito no es negociable, el número de posibles niveles en ilimitada, y no podemos escapar de las barras.
Configuración de routes.rb para http: // foobar / lugares / Europa es trivial:
map.resources :places
... pero http: // foobar / lugares / Europa / Francia se queja "Ninguna acción respondió a Europa". Probé:
map.connect '/places/:id', :controller => 'places', :action => 'show'
... pero esto da el mismo resultado, ya que al parecer el: Identificación del finaliza en el primer '/'. ¿Cómo hago que el ID de cubrir cualquier cosa y todo después de los "lugares"?
Solución
Tener un vistazo a la guía de colocación para la documentación completa:
http://guides.rubyonrails.org/routing.html
Específicamente sección "4.9 Ruta englobamiento".
Pero creo que lo que realmente quiere hacer es declarar su ruta como:
map.connect '/places/*id', :controller => 'places', :action => 'index'
Llamado con una URL como
/places/foo/bar/1
Yields a params[:id] => ["foo", "bar", "1"]
Lo que fácilmente se podría (re) se unen con "/" para producir la cadena completa que desea "foo / bar / 1" (es probable que tenga que volver a insertar la barra inicial manualmente.
Esto debería conseguir que ir.
Otros consejos
pellizqué la respuesta de Cody por encima de un poco para llegar a esto:
map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'
Mediante el uso de map.place en lugar de map.connect, rieles sabe qué recurso nos enfrentamos y place_url
generado, ayudantes, etc place_path
correctamente.
Ahora, la segunda línea de debe trabajo, pero no gracias al fallo anterior, así que aquí tiene una solución para places_controller.rb que divide manualmente el ID y establece el formato, el impago a XML:
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"