Caminar en las Rails routes

Caminar en las Rails routes

La magia de Rails está basada principalmente en el enrutador (routing en inglés) de este framework. Es por eso que si se quiere obtener el máximo potencial de Rails y al mismo tiempo evitar horas de búsqueda tratando de solucionar errores de rutas, lo mejor es entender el proceso detrás de la magia de las rutas. Si deseas saber cómo funciona el enrutador y las rutas en Rails, cómo configurarlas, saber cuáles son las rutas de tu aplicación y usarlas, continúa leyendo.

La idea base del enrutador de Rails es muy sencilla y a la vez potente. Empecemos con un ejemplo de la vida real: Supongamos que quieres comunicarte con alguien que trabaja en un edificio de 100 oficinas, pero no tienes el número directo de esa persona, solo del edificio de oficinas donde trabaja. Tratar de ir al edificio y preguntar en cada oficina no sería lo más práctico, por lo que sería  mucho mejor llamar al número del edificio. Al comunicarte, el/la recepcionista te preguntará con quién deseas hablar, enlazándote  si dicha persona está disponible.

Si comparamos este ejemplo con el proceso de funcionamiento del enrutador, la llamada inicial al edificio sería la petición HTTP del navegador y el enrutador de Rails tomaría el rol del recepcionista, encargándose de hacer la conexión no con una persona, sino realizando una acción. Ésta es un método de un controlador que, al ser llamado, genera una respuesta que será la vista que se muestra al usuario.

Este funcionamiento es bastante fácil de comprender, pero hay mucho más por entender. Para explicar estos conceptos, usaremos en este artículo el ejemplo de una aplicación para libros virtuales que tiene los recursos de los autores y los libros.

Configuración de rutas

Para empezar a trabajar con las rutas, lo primero es saber cómo configurarlas. Toda la configuración de rutas en Rails se realiza en un único archivo, config/routes.rb, generado automáticamente por Rails al crear el proyecto. En un inicio, el archivo estará como se puede ver en la figura de abajo. Un detalle importante es el link que se puede encontrar en la línea 5, mismo que permite ir a la documentación oficial de las rutas (en inglés).

Empecemos configurando las rutas para el autor. Recordemos que se desea contar con rutas que permitan emparejar las peticiones con los métodos/acciones presentes en el controlador. En el archivo routes.rb escribiremos lo siguiente:


Esta ruta tendrá como parámetro el ID del autor y buscará dentro del controlador Autores la acción o método show. Con esto ya se tendría la ruta para mostrar un autor. Las otras acciones más comunes son mostrar todos, crear, editar y eliminar. Lo anterior daría un total de 7 rutas que deberíamos configurar para estas acciones. Afortunadamente, Rails nos facilita el trabajo y permite crear todas estas rutas con una sola línea de código como la siguiente:

Esta línea genera las rutas correspondientes a las acciones RESTful, como se ve a continuación:

  • GET /autores autores#index
  • GET /autores/new autores#new
  • POST /autores autores#create
  • GET /autores/:id autores#show
  • GET /autores/:id/edit autores#edit
  • PATCH/PUT /autores/:id autores#update
  • DELETE /autores/:id autores#destroy

Si por alguna razón en tu aplicación no necesitas todas estas rutas para un recurso, Rails también ofrece la posibilidad de declarar solo las necesarias a través de resources. A continuación, se muestra un ejemplo donde se configuran las rutas para el mismo recurso, autor, pero solo para index y show:


Sin embargo, en este ejemplo necesitamos todas las rutas, así que volveremos a configurarlas como estaban anteriormente, es decir, resources :autores. De esta manera, ya se han configurado todas las rutas necesarias para el recurso autor. Un punto muy importante aquí es que para utilizar resources los nombre de los métodos/acciones en tu controlador, deben ser los mismos acorde con la convención show, destroy, update etc. Claro, también es posible personalizarlos, pero seguir la regla de oro de Rails convención sobre configuración te permitirá crear aplicaciones de forma más rápida y estandarizada.

Rutas anidadas

Es muy sencillo configurar la ruta para un recurso, pero cuando éste por la lógica de la aplicación es el hijo de otro recurso, se requiere acudir a las rutas anidadas. Presta mucha atención a esta sección: declarar rutas anidadas es muy sencillo, pero no entender por qué se anidan o el nivel correcto de anidamiento es uno de los mayores problemas para quienes empiezan a trabajar con rutas en Rails.

En nuestro ejemplo, tenemos el autor, el cual (por lógica) puede tener uno o varios artículos, entonces el recurso artículo debería tener las rutas anidadas con el autor. Hacer esto en Rails es tan simple como se ve a continuación:


Así ya se tienen configuradas las rutas tanto para el padre, autor, como para el recurso hijo, artículo. Si bien Rails permite anidamientos de rutas más complejos, es recomendable un máximo de tres niveles (por ejemplo, el autor tiene artículos y el artículo tiene fotos). Un anidamiento más profundo se vuelve complejo de mantener.

Para evitar este problema, se pueden configurar solo las rutas que necesitan identificar al padre del recurso como rutas anidadas y las otras de forma normal, así:


Rails también ofrece una sintaxis abreviada para esto:


Otro factor que no se debe olvidar es que las rutas anidadas, al ser llamadas, necesitan el ID del recurso padre además del hijo. Si desearas crear un nuevo artículo, la ruta necesitará el ID del autor al que pertenecerá el artículo. Ojo: olvidar esto genera errores y un mal funcionamiento en la aplicación.

Adicionalmente a las rutas de las que se ha hablado, también se debe declarar la ruta raíz encargada de dirigirnos a la acción que procesa la vista de nuestra página inicial. En nuestro ejemplo, la página inicial será el index de los autores, para configurar esta ruta basta con escribir root "autores#index" en nuestro archivo de config/routes.rb. Así se ha terminado de configurar las rutas, por lo que el archivo final quedaría así:

Visualizar tus rutas

Ahora ya conoces cómo configurar tus rutas, pero mientras desarrollas tu aplicación a menudo necesitarás ver cuáles son las rutas que tienes configuradas. Para ello, Rails ofrece varias opciones. Primero en tu terminal puedes ejecutar el comando rails routes, así:

Otra opción es agregar la bandera -E al comando para tener una visualización más organizada.


Si lo deseado es buscar alguna ruta en específico, se pueden usar las opciones -g, que devuelven todas las rutas que tengan una similitud parcial, y -c que devuelve todas las rutas de un controlador específico.


Llamado a las rutas

Hasta el momento hemos visto cómo configurar las rutas que se emparejan con las diferentes acciones en nuestros controladores, pero también querremos llamar estas rutas en nuestra aplicación. Para ello, no es necesario escribir toda la URL o path de la ruta, ya que Rails también cuenta con métodos para facilitarnos este trabajo. Dichos métodos son los routes helpers _path y _url. Pongamos el ejemplo con las rutas del autor utilizando el helper _path:

helper

retorna

autores_path

/autores

new_autor_path

/photos/new


edit_photo_path(:id)

/photos/10/edit

photo_path(:id)

/photos/10



En el caso del helper _url, éste se diferencia en que devuelve el path, pero también el host y el puerto.

Organización de rutas

En proyectos pequeños como el abordado en este artículo, es fácil mantener las rutas ordenadas, pero cuando es un proyecto grande, mantener las rutas bien organizadas se puede convertir en un desafío. Aún así, es esencial mantenerlas en orden para evitar errores en la aplicación. Entre lo que se puede hacer para mantener las rutas en orden está:

  • Declarar las rutas solo para las acciones necesarias. Como se explicó antes, con Rails se puede especificar ciertas acciones. Esto permite tener solo las rutas que se requieren para la aplicación y evitar aquéllas que no se utilizarán.
  • Nombrar a tus rutas. Cuando se tienen muchas rutas, puede ser de utilidad darles un alias. Esto se logra con la palabra clave :as.
  • Agrupamiento de rutas. Se pueden agrupar rutas relacionadas entre sí bajo un mismo alcance utilizando el método scope. Esto es de gran utilidad porque permite establecer opciones de forma predeterminada para todas las rutas en el mismo grupo.


Conclusión

Las rutas en Rails permiten que el enrutador pueda llamar a las acciones correctas y hacer funcionar nuestra aplicación como queremos. Rails ofrece diversos métodos para configurarlas (resources), visualizarlas (rails routes) y llamarlas en nuestra aplicación sin tener que escribir toda la url, gracias a _path and _helper.

Aunque cada proyecto tiene sus diferentes requerimientos y esto puede variar un poco el cómo se manejan las rutas, las bases explicadas en este artículo te serán de gran utilidad. Espero que hayas disfrutado leyéndolo.

Hasta el siguiente artículo.

⚠️
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Revelo.

Revelo Content Network da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.