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 end
Then, other rack applications can register with the multi_run plugin:
App.run "ra", PlainRackApp App.run "ro", OtherRodaApp App.run "si", SinatraApp
Inside 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 end
This will dispatch routes starting with /ra
to PlainRackApp
, routes starting with /ro
to OtherRodaApp
, and routes starting with /si
to SinatraApp.
You can pass a block to r.multi_run
that will be called with the prefix, before dispatching to the rack app:
App.route do |r| r.multi_run do |prefix| # do something based on prefix before the request is passed further end end
This is useful for modifying the environment before passing it to the rack app.
You can also call Roda.run
with a block:
App.run("ra"){PlainRackApp} App.run("ro"){OtherRodaApp} App.run("si"){SinatraApp}
When called with a block, Roda
will call the block to get the app to dispatch to every time the block is called. The expected usage is with autoloaded classes, so that the related classes are not loaded until there is a request for the related route. This can sigficantly speedup startup or testing a subset of the application. When freezing an application, the blocks are called once to get the app to dispatch to, and that is cached, to ensure the any autoloads are completed before the application is frozen.
The multi_run plugin is similar to the hash_branches and multi_route plugins, with the difference being the hash_branches and multi_route plugins keep 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.
To handle development environments that reload code, you can call the run
class method without an app to remove dispatching for the prefix.
Classes and Modules
Public Class methods
Initialize the storage for the dispatched applications
# File lib/roda/plugins/multi_run.rb 67 def self.configure(app) 68 app.opts[:multi_run_apps] ||= {} 69 app.opts[:multi_run_app_blocks] ||= {} 70 end