I just over-rode Merb::Rack::Application#call to process multiple
controller-requests.

Has any one else done this yet?  My implementation is very raw, just a
proof-of-concept, but it works.

I'm using this to process ajax requests where a certain param contains
a json-encoded array of requests.  each json-encoded request has an
url param matching a standard Merb route.

eg:  requests: [{url: '/products/view/1}, {url: '/accounts/list'}]

# if any request comes into /router, look for json-encoded array of
requests in param "requests"
if env["REQUEST_PATH"] == "/router"
    body = env[Merb::Const::RACK_INPUT]
    body.rewind if body.respond_to?(:rewind)
    json = body.read

    params = Merb::Parse.query(json)
    requests = JSON.parse(params["requests"])

    status = nil
    responses = []
    headers = nil
    rack_response = nil

    # iterates array of requests and dispatch to each controller.
    requests.each do |req|
        env["REQUEST_URI"] = req["url"]
        env["REQUEST_PATH"] = req["url"]
        rack_response = ::Merb::Dispatcher.handle(Merb::Request.new
(env))

        responses << rack_response[2]  # <-- capture each response
body
        status = rack_response[0]
        headers = rack_response[1]
    end

    # compose a rack response from the array of responses.  this is
pretty ugly right now.  assumes each
    # controller's action returned json.
    rack_response = [status, headers, "[" + responses.join(',') + "]"]

else  # <-- otherwise, do normal behaviour.
    rack_response = ::Merb::Dispatcher.handle(Merb::Request.new(env))
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"merb" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/merb?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to