Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rails 4: split routes.rb into multiple smaller files

I would like to split my routes in rails 4 application. For rails 3 the question has been answered a few times like:

  • How to split routes.rb into smaller files
  • Splitting Routes File Into Multiple Files

What would be the correct way to do this in rails 4 + how to get control over the order the routes get loaded?

Suggested from the rails 3 questions:

application.rb

    config.paths['config/routes'] = Dir["config/routes/*.rb"]

Fails with:

/Users/jordan/.rvm/gems/ruby-2.0.0-head@books/gems/railties-4.0.0/lib/rails/application/routes_reloader.rb:10:in `rescue in execute_if_updated': Rails::Application::RoutesReloader#execute_if_updated delegated to updater.execute_if_updated, but updater is nil:

@route_sets=[#]> (RuntimeError)

like image 975
Rubytastic Avatar asked Sep 17 '13 08:09

Rubytastic


2 Answers

I've manage that this way:

# config/application.rb
config.autoload_paths << Rails.root.join('config/routes')

# config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'

  extend ApiRoutes
end

# config/routes/api_routes.rb
module ApiRoutes
  def self.extended(router)
    router.instance_exec do
      namespace :api do
        resources :tasks, only: [:index, :show]
      end
    end
  end
end

Here I added config/routes directory to autoload modules defined in it. This will ensure that routes are reloaded when these files change.

Use extend to include these modules into the main file (they will be autoloaded, no need to require them).

Use instance_exec inside self.extended to draw routes in the context of router.

like image 93
cutalion Avatar answered Nov 12 '22 21:11

cutalion


A bit late to the party but you can do this in Rails 4 by monkey patching the mapper at the top of your routes.rb file. ie:

# config/routes.rb
class ActionDispatch::Routing::Mapper
  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end
end

And then using the draw method in routes.rb with:

Rails.application.routes.draw do
  draw :api
end

This will expect a file in config/routes/api.rb.

A slightly fuller explanation with examples of splitting the routes file here.

like image 9
Michael Cho Avatar answered Nov 12 '22 22:11

Michael Cho