Module: Roda::RodaPlugins::HashPaths
- Defined in:
- lib/roda/plugins/hash_paths.rb
Overview
The hash_paths plugin allows for O(1) dispatch to multiple routes at any point in the routing tree. It is useful when you have a large number of specific routes to dispatch to at any point in the routing tree.
You configure the hash paths to dispatch to using the hash_path
class method, specifying the remaining path, with a block to handle that path. Then you dispatch to the configured paths using r.hash_paths
:
class App < Roda
plugin :hash_paths
hash_path("/a") do |r|
# /a path
end
hash_path("/a/b") do |r|
# /a/b path
end
route do |r|
r.hash_paths
end
end
With the above routing tree, the r.hash_paths
call will dispatch requests for the /a
and /a/b
request paths.
The hash_path
class method supports namespaces, which allows r.hash_paths
to be used at any level of the routing tree. Here is an example that uses namespaces for sub-branches:
class App < Roda
plugin :hash_paths
# Two arguments provided, so first argument is the namespace
hash_path("/a", "/b") do |r|
# /a/b path
end
hash_path("/a", "/c") do |r|
# /a/c path
end
hash_path(:b, "/b") do |r|
# /b/b path
end
hash_path(:b, "/c") do |r|
# /b/c path
end
route do |r|
r.on 'a' do
# No argument given, so uses the already matched path as the namespace,
# which is '/a' in this case.
r.hash_paths
end
r.on 'b' do
# uses :b as the namespace when looking up routes, as that was explicitly specified
r.hash_paths(:b)
end
end
end
With the above routing tree, requests for the /a
branch will be handled by the first r.hash_paths
call, and requests for the /b
branch will be handled by the second r.hash_paths
call. Those will dispatch to the configured hash paths for the /a
and :b
namespaces.
It is best for performance to explicitly specify the namespace when calling r.hash_paths
.
Defined Under Namespace
Modules: ClassMethods, RequestMethods
Class Method Summary collapse
Class Method Details
.configure(app) ⇒ Object
78 79 80 |
# File 'lib/roda/plugins/hash_paths.rb', line 78 def self.configure(app) app.opts[:hash_paths] ||= {} end |