Rails: Dividir tus routes en diferentes archivos

Rails: Dividir tus routes en diferentes archivos

enmanuelm19@gmail.com2020-07-03 01:39:08 UTC

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.


Compartir