From: Sys Ppp Date: 2009-08-27T12:48:15+09:00 Subject: Re: Rack must not dictate how to create a middleware Brian Candler wrote: > I did look at this myself once - I wanted to be able to pass extra > parameters to the middleware modules. But the problem was the deferred > initialisation of the modules, which was required to build them in the > inside-out order. I decided that it was simpler in such cases not to use > middleware, but to construct the stack explicitly: > > run Foo.new(Bar.new(Baz.new)) It is not very hard. module Node def create app @app = app self end def call env, *args str, *new_args = get_str args status, header, resp = @app.call env, new_args new_resp = Rack::Response.new(str, status, header) new_resp.write resp.body return new_resp.finish end end builder = Rack::Builder.new do use ... ....... use ... map '/' do module MidA def self.get_str *args ["

MidA args: #{args}

\n", args, 'AAA'] end extend Node end run MidA.method(:create) module MidB def self.get_str *args ["

MidB args: #{args}

\n", args, 'BBB'] end extend Node end run MidB.method(:create) p = Proc.new do |env, *args| resp = Rack::Response.new resp.write "

Main args: #{args}

\n" resp.finish end run p end end Or something else like that. I think, blocks may be easy passed down to middleware chains. Like this. status, header, resp = @app.call env, args {|...| ...} But I have not yet invented how to use such pervertion. :) -- Posted via http://www.ruby-forum.com/.