ruby on rails - Rack Middleware: use and run constructs -


i reading this article on rack middleware. states following:

rack more interface can used talk web server. it’s used group , order modules, ruby classes, , specify dependency between them. rack::builder puts these modules on top of each other, creating stack-like structure of final web application.

so basically, can use ruby classes stack middleware on top of each other. need reference next middleware - kind of reminds me of decorator design pattern.

all need have constructor takes next application (middleware in stack) paraemter. second, need define call method, takes environment hash parameter , returns array of status code, environment hash , response body.

this example provided:

# shrimp.rb class shrimp   def initialize(app)     @app = app          end                    def call(env)           @app.call(env)      end                 end                    # config.ru require 'rack' require 'rack/lobster' require 'shrimp'        use shrimp             run rack::lobster.new </pre>  

according rack documentation, use method adds middleware stack, , run method dispatches application. i'm little confused syntax. use adds shrimp middleware stack , run passes lobster instance shrimp constructor? still confused role of run here.

the article have linked mentions rack comes sample application lobster yes, start, app.

the shrimp class ruby class how middleware should written.

in config.ru file, require modules, register middleware, , run application.

use adds shrimp middleware stack , run passes lobster instance shrimp constructor?

you right when use adds shrimp middleware stack run not pass lobster instance shrimp constructor. run executes rack application , passing app instance how rack works internally. real thing happens in use part register middleware.

for example:

# config.ru require 'rack' require 'rack/lobster' require 'shrimp_1'      require 'shrimp_2'      require 'shrimp_3'        use shrimp_1       use shrimp_2       use shrimp_3             run rack::lobster.new </pre> 

all 3 shrimp classes passed app(lobster) instance in order , handled rack itself.


Comments