2008/5/28 NachoKB <[EMAIL PROTECTED]>:
> 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
>
¿Si ponés un before_filter en todos los controllers que haga el
redirect? Hasta podés hacer un poco de monkey patching en
ActionController::Base para no tener ese código repetido x todos lados
(o hacer que todos tus controllers hereden del "redirect controller").
Por último, habría que poner un controller x defecto que redireccione
o muestre un error (para los URLs inválidos).
My 2 cents,
Aureliano.
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar