Module: Roda::RodaPlugins::MultiRun
- Defined in:
- lib/roda/plugins/multi_run.rb
Overview
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.
Defined Under Namespace
Modules: ClassMethods, RequestClassMethods, RequestMethods
Class Method Summary collapse
-
.configure(app) ⇒ Object
Initialize the storage for the dispatched applications.
Class Method Details
.configure(app) ⇒ Object
Initialize the storage for the dispatched applications
67 68 69 70 |
# File 'lib/roda/plugins/multi_run.rb', line 67 def self.configure(app) app.opts[:multi_run_apps] ||= {} app.opts[:multi_run_app_blocks] ||= {} end |