The named_routes plugin allows for multiple named routes, which the main route block can dispatch to by name at any point by calling r.route. If the named route doesn’t handle the request, execution will continue, and if the named route does handle the request, the response returned by the named route will be returned.
Example:
plugin :named_routes route('foo') do |r| r.is 'bar' do '/foo/bar' end end route('bar') do |r| r.is 'foo' do '/bar/foo' end end route do |r| r.on "foo" do r.route 'foo' end r.on "bar" do r.route 'bar' end end
Note that in multi-threaded code, you should not attempt to add a named route after accepting requests.
To handle development environments that reload code, you can call the route class method without a block to remove an existing named route.
Routing Files¶ ↑
The convention when using the named_routes plugin is to have a single named route per file, and these routing files should be stored in a routes subdirectory in your application. So for the above example, you would use the following files:
routes/bar.rb routes/foo.rb
Namespace Support¶ ↑
The named_routes plugin also has support for namespaces, allowing you to use r.route at multiple levels in your routing tree. Example:
route('foo') do |r| r.on("baz"){r.route("baz", "foo")} r.on("quux"){r.route("quux", "foo")} end route('bar') do |r| r.on("baz"){r.route("baz", "bar")} r.on("quux"){r.route("quux", "bar")} end route('baz', 'foo') do |r| # handles /foo/baz prefix end route('quux', 'foo') do |r| # handles /foo/quux prefix end route('baz', 'bar') do |r| # handles /bar/baz prefix end route('quux', 'bar') do |r| # handles /bar/quux prefix end route do |r| r.on "foo" do r.route("foo") end r.on "bar" do r.route("bar") end end
Routing Files¶ ↑
The convention when using namespaces with the multi_route plugin is to store the routing files in subdirectories per namespace. So for the above example, you would have the following routing files:
routes/bar.rb routes/bar/baz.rb routes/bar/quux.rb routes/foo.rb routes/foo/baz.rb routes/foo/quux.rb
Classes and Modules
Public Class methods
Initialize storage for the named routes.
# File lib/roda/plugins/named_routes.rb 109 def self.configure(app) 110 app.opts[:namespaced_routes] ||= {} 111 end