Class: Ramaze::AddressableRoute
- 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.
Instance Method Summary collapse
- #call(env) ⇒ Object
- #dispatch(env, target, extracted) ⇒ Object
-
#initialize(app, routes = {}) ⇒ AddressableRoute
constructor
A new instance of AddressableRoute.
- #map(from, to) ⇒ Object
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 |