1
0
Fork 0
mirror of https://github.com/sinatra/sinatra synced 2023-03-27 23:18:01 -04:00

refactor process_route

This commit is contained in:
Konstantin Haase 2011-10-30 12:53:18 -07:00
parent 1e0477f570
commit 32814f8d6f
2 changed files with 13 additions and 14 deletions

View file

@ -797,22 +797,22 @@ module Sinatra
#
# Returns pass block.
def process_route(pattern, keys, conditions, block = nil, values = [])
@original_params ||= @params
route = @request.path_info
route = '/' if route.empty? and not settings.empty_path_info?
if match = pattern.match(route)
values += match.captures.to_a.map { |v| force_encoding URI.decode(v) if v }
params = {'splat' => [], 'captures' => values}
keys.zip(values) { |k,v| (params[k] ||= '') << v if v }
@params = @original_params.merge(params)
@block_params = values
catch(:pass) do
conditions.each { |c| throw :pass if c.bind(self).call == false }
block ? block[self, @block_params] : yield(self, @block_params)
end
return unless match = pattern.match(route)
values += match.captures.to_a.map { |v| force_encoding URI.decode(v) if v }
if values.any?
original, @params = params, params.merge('splat' => [], 'captures' => values)
keys.zip(values) { |k,v| (@params[k] ||= '') << v if v }
end
catch(:pass) do
conditions.each { |c| throw :pass if c.bind(self).call == false }
block ? block[self, values] : yield(self, values)
end
ensure
@params = @original_params
@params = original if original
end
# No matching route was found or all routes passed. The default

View file

@ -370,8 +370,7 @@ class RoutingTest < Test::Unit::TestCase
"firefox" => {"engine" => {"name"=>"spidermonkey", "version"=>"1.7.0"}},
"chrome" => {"engine" => {"name"=>"V8", "version"=>"1.0"}}
},
"paste" => {"name"=>"hello world", "syntax"=>"ruby"},
"splat"=>[], "captures"=>[]
"paste" => {"name"=>"hello world", "syntax"=>"ruby"}
}
mock_app {
get '/foo' do