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'}

Constant Summary collapse

ROUTES =
{}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ AddressableRoute

Returns a new instance of AddressableRoute.



32
33
34
# File 'lib/ramaze/contrib/addressable_route.rb', line 32

def initialize(app)
  @app = app
end

Class Method Details

.map(from, to) ⇒ Object



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

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

Instance Method Details

#call(env) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/ramaze/contrib/addressable_route.rb', line 36

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



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

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