Rutas en Rails 3
El módulo de routing en Rails 3 sufrió grandes cambios. Ahora puedes tener un archivo routes.rb con buen aspecto, legible y totalmente enfocado a REST.
Veamos las nuevas características del routing en rails 3 parte por parte:
Rutas regulares
El mapeo al controlador y la acción ahora es por una sola cadena del tipo controller#action.
Rutas nombradas
Las rutas nombradas generan helpers como posts_url y posts_path, para usarlos en lugar de especificar el hash con el controlador y la acción en los helpers como link_to
Ruta vacía
La raíz del sitio web es la ruta vacía ('/'). Si en Rails 2 ya era fácil definirla ahora es mucho más simple en Rails 3:
Atajos
Las renovadas rutas en Rails 3 introducen algunos atajos para rutas comunes. Hay dos tipos de atajos. Primero, el :to puede omitirse, por lo que puedes designar la ruta a el mapeador:
Segundo, el atajo match permite definir el path y el controlador con su acción al mismo tiempo:
Verbos
Puedes limitar una ruta a una petición HTTP através de la opción :via, y además hay un atajo para tal:
Rack
Rack es una interfaz para web servers que provee un API unificada para los frameworks Ruby. Ahora con el nuevo soporte para Rack significa que tu aplicación no tiene porqué ser obligatoriamente Rails. Puedes tener algunas partes de la aplicación manejadas por cualquier framework que soporte Rack, como Sinatra, Cramp o cualquier otra cosa. Puedes saltarte todo el stack de Rails y pasar la petición a la aplicación Rack.
Por ejemplo, para una aplicación en Sinatra:
Y este es un ejemplo de una aplicación Rack:
Rutas REST
Desde Rails 1.2, las rutas REST han sido la manera preferida de usar el ruteo. Reconociendo este hecho, el equipo core de Rails ha hecho algunas mejoras. Veamos esta ruta típica en Rails 3:
Esto generaría todos los helpers útiles que hemos llegado a amar y también mapearían las rutas correspondientes. Y tal como antes, puedes añadir múltiples recursos en una sola línea:
Más acciones RESTful
Como sabes, no estamos limitados a las siete acciones que la arquitectura RESTful provee, sino que también puedes definir más acciones en un recurso. Sin embargo, debes tener cuidado de no agregar muchas acciones a un solo recurso, te convendría separarlos en varios recursos.
Podemos agregar acciones RESTful a un recurso de diferentes maneras. Aquí ha unas cuantas acciones RESTful para collection dentro de un bloque:
Y observa este member en la misma línea:
No sólo eso, sino que puedes redefinir el ámbito de las siete acciones predeterminadas:
Acciones create, que usualmente sólo aceptan peticiones POST, ahora pueden aceptar peticiones GET también:
Recursos anidados
En rails 2, los recursos anidados eran definidos por un bloque, o usando una llave :has_many o :has_one. Estos últimos han sido suprimidos por un bloque, dando un estilo más Rubyiesco para definir recursos asociados.
Aquí está una ruta para un proyecto que tiene muchas tareas y personas:
Espacio de nombres
Estos son especialmente útiles cuando definimos recursos en un directorio; no se puede tener algo más limpio que esto:
Renombrando recursos
Puedes renombrar recursos através de la llave :as. Este código usa :as en rutas REST para cambiar el path de los productos a devices:
Restringiendo recursos
Los recursos pueden ser restringidos a sólo acciones específicas.
Alterando nombres de paths
Puedes definir un nombre diferente para una acción REST particular. Esto ayuda a personalizar tus rutas RESTful. Este código enrutará /projects/1/cambiar a la acción edit.
El método Redirect
El nuevo método redirect en Rails 3 provee un nivel de conveniencia que no estaba presente antes. Por ejemplo, puede redirigir a cualquier path dado y eventualmente, puede también pasar a una URI completa, algo anteriormente logrado por plugins de Rails como redirect_routing.
Es más, el método redirect también incluye acciones genéricas. Únicas en Rails 3, las acciones genéricas son una manera simple de proveer la misma acción a paths complejos, dependiendo de qué se pase a redirect.
Este código redireccionará /foo/1 a /bar/1s:
Este código redireccionará /account/proc/john to /johns
Nótese que redirect no puede ser usado en un bloque como opuesto a otras constantes y ámbitos.
El método Constraints
Constraints te permite especificar requisitos para los segmentos del path en las rutas. Además de eso, te permite usar métodos para verificar si algo cumple con un criterio dado. Como una ruta que checa si la petición es AJAX o no, por ejemplo.
En este código, estamos usando expresiones regulares, y la ruta ha sido restringida a sólo permitir un dígito como ID:
Scope
Cuando a el método scope se le pasa un símbolo, asume que el símbolo es un controlador. Cuando el argumento es una cadena, el método scope antepone esa cadena al principio del path.
Scope también puede tener path_segments, los cuales pueden ser condicionados, dándonos una gran flexibilidad en las rutas.
Como puedes ver, cuando scope recibe una cadena como argumento, la antepone al path, algo que era logrado con path_prefix en Rails 2. name_prefix es esencialmente lo mismo que antes.
Segmentos opcionales
A diferencia de todas las versiones anteriores de Rails, los segmentos del path ahora pueden ser opcionales en las rutas.
Los segmentos opcionales no necesariamente tiene que ser segmentos de path, los cuales son pasados como parámetros a la acción. La ruta predeterminada es un buen ejemplo de segmentos opcionales en uso. Aquí, ambos /posts/new y /posts serán redireccionados a la acción create en el controlador de posts, pero /posts/edit no funcionará:
Este es un path opcional en el ámbito que permite tener un path antepuesto al recurso:
Bloques generalizados
Como es evidente en los ejemplos, las rutas en Rails 3 exhiben bloques generalizados para casi todos los métodos que normalmente querrías pasar a un bloque, ayudándote a alcanzar el principio DRY en routes.rb.
Ahora mismo, muchos de los desarrolladores Rails no usarían todos estos métodos, pero cuando la necesidad existe – cuando necesites definir rutas más complejas – apreciarás tener toda la información de arriba a la mano. No necesitas usar un plugin o un hack cuando sabes que ya está disponible. Con Rails 3, las rutas están en otro nivel completamente.
Este artículo es una traducción/adaptación de The lowdown on routes in rails 3
Preguntas y comentarios bienvenidos!
