I would like to split my routes in rails 4 application. For rails 3 the question has been answered a few times like:
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)
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With