Class: Ramaze::AddressableRoute

Inherits:
Object
  • Object
show all
Defined in:
lib/ramaze/contrib/addressable_route.rb

Overview

This is a simple prototype-implementation of how we could do routing supported by URI templates.

Please see the spec for example usage as it’s not integrated yet in any way.

What it does is basically that you can give it any URI template and a final mapping, and it will extract the variables from the URI and merge them into the QUERY_STRING, which is parsed again in Ramaze if you issue Request#params.

I haven’t explored the full capabilities of the templates yet, but the specs of Addressable::Template suggest that there is a lot to be discovered.

Examples:

given mapping like:


map('/customer/{customer_id}/order/{order_id}', '/order/show')

output of request.params at ‘/order/show’


{'customer_id => '12', 'order_id' => '15'}

Instance Method Summary collapse

Constructor Details

#initialize(app, routes = {}) ⇒ AddressableRoute

Returns a new instance of AddressableRoute.



26
27
28
29
30
31
# File 'lib/ramaze/contrib/addressable_route.rb', line 26

def initialize(app, routes = {})
  @app = app
  @routes = {}

  routes.each{|from, to| map(from, to) }
end

Instance Method Details

#call(env) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/ramaze/contrib/addressable_route.rb', line 33

def call(env)
  path_info = env['PATH_INFO']

  @routes.each do |template, target|
    extracted = template.extract(path_info)
    return dispatch(env, target, extracted) if extracted
  end

  @app.call(env)
end

#dispatch(env, target, extracted) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/ramaze/contrib/addressable_route.rb', line 48

def dispatch(env, target, extracted)
  env['PATH_INFO'] = target
  original = Rack::Utils.parse_query(env['QUERY_STRING'])
  env['QUERY_STRING'] = Rack::Utils.build_query(original.merge(extracted))

  @app.call(env)
end

#map(from, to) ⇒ Object



44
45
46
# File 'lib/ramaze/contrib/addressable_route.rb', line 44

def map(from, to)
  @routes[Addressable::Template.new(from)] = to
end