Grupo,
tengo una duda con respecto a las rutas. El problema particular es que
necesito implementar redirects arbitrarios administrables por un usuario
(por lo que voy a tener un model Redirect, etc, etc).
En donde me trabé es con las benditas rutas. Según entiendo, el primer
mapeo que matchea la url (según el orden en que se declaran en el routes.rb)
es el que determina qué es lo que se ejecuta.
Mi problema es si quiero tener redirects arbitrarios, necesito una manera
de que, si la url no matchea algún redirect específico (y esto está definido
por lógica propia del redirect, no alcanza el método connect...), poder
continuar con la evaluación de las rutas subsiguientes.
Algo así nunca lo vi posteado en ningún lado. Doy un ejemplo a ver si
puedo aclarar un poco:
routes.rb:
map.connect '*path', :controller => :redirects, :action => redirect
map.connect ':controller/:action/:id'
>
en este caso, la segunda regla nunca se llega a considerar (ya que la
primera siempre matchea). RedirectsController siempre se ejecuta, aún cuando
no encuentre un redirect que aplique a la URL del request (en cuyo caso no
tiene forma de devolver el control de flujo a Routing).
Entonces, dije, hago algo así (siempre usando rutas clásicas sin resources
en los ejemplos):
routes.rb:
map.connect ':controller/:action/:id'
map.connect '*path', :controller => :redirects, :action => redirect
El problema con este approach es que si tengo un controller "Blog", por
ejemplo, y quiero tener un redirect de "/blog/read/16" a "
/blog/show/nombre-de-un-post", "/blog/read/16" matchea la primera regla (con
{ :controller => :blog, :action => :read, :id => "16" }) y nunca se ejecuta
el controller Redirects...
Por un lado necesito la flexibilidad de trabajar con redirects
absolutamente arbitrarios (editables por un usuario), pero por otro lado
comienzo a temer por el lado de performance. Una que se me había ocurrido
era extender el connect con un bloque (que sirva de predicate para aceptar
la regla definitivamente, y ahí pondría la lógica propia). El problema sería
que eso se ejecutaría absolutamente en todo request (teniendo un overhead
que puede ser notable si no cacheo esas consultas).
Se me ocurriría extender Redirect Routing [1] para soportar bloques (me
ahorraría el controller)... tendría que pensar en cómo hacerlo lo más light
posible de todas maneras...
¿Se les ocurre o conocen algo que se me haya pasado?
nacho
[1] http://pinds.com/2006/07/18/release-redirect-routing-plugin-for-rails
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar