module Roda::RodaPlugins::MultiRun

  1. lib/roda/plugins/multi_run.rb

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.

Methods

Public Class

  1. configure

Public Class methods

configure(app)

Initialize the storage for the dispatched applications

[show source]
   # 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