The :multi_run plugin provides the ability to easily dispatch to other Rack applications based on the request path prefix.
First, load the plugin:
class App < Roda
plugin :multi_run
endThen, other Rack applications can register with the :multi_run plugin:
App.run "ra", PlainRackApp
App.run "ro", OtherRodaApp
App.run "si", SinatraAppInside your route block, you can call r.multi_run to dispatch to all three Rack applications based
on the prefix:
App.route do |r|
r.multi_run
endThis will dispatch routes starting with /ra to PlainRackApp, routes starting with /ro to OtherRodaApp,
and routes starting with /si to SinatraApp.
The :multi_run plugin is similar to the :multi_route plugin, with the difference being the
:multi_route plugin keeps all routing subtrees in the same Roda app/class, while :multi_run
dispatches to other Rack apps.
If you want to isolate your routing subtrees, :multi_run is a better approach, but it does not
let you set instance variables in the main Roda app and have those instance variables usable in
the routing subtrees.
#.freezeFreeze the multi_run apps so that there can be no thread safety issues at runtime.
#.multi_run_appsHash storing rack applications to dispatch to, keyed by the prefix for the application.
#.run(prefix, app)Add a rack application to dispatch to for the given prefix when r.multi_run is called.
#.refresh_multi_run_regexp!Refresh the #.multi_run_regexp, using the stored route prefixes, preferring longer routes before shorter routes.
#.multi_run_regexpRefresh the #.multi_run_regexp if it hasn't been loaded yet.
#.multi_runIf one of the stored route prefixes match the current request, dispatch the request to the stored Rack application.