1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Use rackmounts recognize api and don't piggyback recognize_path on

top of rack call
This commit is contained in:
Joshua Peek 2009-12-11 00:11:16 -06:00
parent 588225f885
commit 61e9f2023b
2 changed files with 30 additions and 21 deletions

View file

@ -2,7 +2,7 @@ module ActionDispatch
module Routing
class Mapper
class Constraints
def new(app, constraints = [])
def self.new(app, constraints = [])
if constraints.any?
super(app, constraints)
else

View file

@ -18,36 +18,37 @@ module ActionDispatch
def call(env)
params = env[PARAMETERS_KEY]
prepare_params!(params)
unless controller = controller(params)
return [417, {}, []]
end
controller.action(params[:action]).call(env)
end
def prepare_params!(params)
merge_default_action!(params)
split_glob_param!(params) if @glob_param
params.each do |key, value|
if value.is_a?(String)
value = value.dup.force_encoding(Encoding::BINARY) if value.respond_to?(:force_encoding)
params[key] = URI.unescape(value)
end
end
end
unless controller = controller(params)
return [417, {}, []]
end
if env['action_controller.recognize']
[200, {}, params]
else
controller.action(params[:action]).call(env)
def controller(params)
if params && params.has_key?(:controller)
controller = "#{params[:controller].camelize}Controller"
ActiveSupport::Inflector.constantize(controller)
end
rescue NameError
nil
end
private
def controller(params)
if params && params.has_key?(:controller)
controller = "#{params[:controller].camelize}Controller"
ActiveSupport::Inflector.constantize(controller)
end
rescue NameError
nil
end
def merge_default_action!(params)
params[:action] ||= 'index'
end
@ -460,6 +461,7 @@ module ActionDispatch
def recognize_path(path, environment = {})
method = (environment[:method] || "GET").to_s.upcase
path = Rack::Mount::Utils.normalize_path(path)
begin
env = Rack::MockRequest.env_for(path, {:method => method})
@ -467,9 +469,16 @@ module ActionDispatch
raise ActionController::RoutingError, e.message
end
env['action_controller.recognize'] = true
status, headers, body = call(env)
body
req = Rack::Request.new(env)
@set.recognize(req) do |route, params|
dispatcher = route.app
if dispatcher.is_a?(Dispatcher) && dispatcher.controller(params)
dispatcher.prepare_params!(params)
return params
end
end
raise ActionController::RoutingError, "No route matches #{path.inspect} with #{environment.inspect}"
end
end
end