Dividir los Rails routes en diferentes archivos
Llega un punto en donde tu aplicación crece y con esta la necesidad de organizarse, empezamos a dividir las responsabilidades de nuestros código según el modelo de negocio, se empiezan a identificar los actores y características para que nuestro código base sea legible y este bien estructurado. Y al final archivo que define las rutas de nuestro aplicativo termina teniendo cientos o miles de lineas de código, algo por el estilo:
#config/routes.rb
Rails.application.routes.draw do
namespace :admin do
# 100 lineas de código despues
end
namespace :chief do
# 100 lineas de código despues
end
namespace :api do
namespace :v1 do
# 100 lineas más
end
namespace :v2 do
# 100 lineas más
end
end
end
Debido a esto tener un estándar para agregar rutas o ubicarlas se vuelve una tarea complicada. @dhh en este gist nos enseña una manera súper simple de poder dividir nuestras rutas en diferentes archivos, se realiza definiendo un método de instancia draw
que básicamente evalúa el contenido de los archivos que definamos y lo aplica al bloque que define nuestras rutas de la siguiente manera:
class ActionDispatch::Routing::Mapper
def draw(routes_name)
instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
end
end
Rails.application.routes.draw do
draw :admin
draw :chief
draw :api
end
De esta manera podemos tener archivos bajo el directorio config/routes/admin.rb, config/routes/chief.rb, config/routes/api.rb y dentro de estos tener definidos las rutas debidamente separadas, de la siguiente manera:
# config/routes/admin.rb
namespace :admin do
resource :posts
# ...
end
Espero que este post haya sido de ayuda para poder organizar mejor tu aplicación, cualquier duda o sugerencia no dudes en comentar.