提交 402c2af5 编写于 作者: A Aaron Patterson

give all endpoints a superclass

上级 40514aa2
module ActionDispatch
module Routing
class Endpoint # :nodoc:
def dispatcher?; false; end
def redirect?; false; end
def matches?(req); true; end
def app; self; end
end
end
end
......@@ -6,6 +6,7 @@
require 'active_support/core_ext/module/remove_method'
require 'active_support/inflector'
require 'action_dispatch/routing/redirection'
require 'action_dispatch/routing/endpoint'
module ActionDispatch
module Routing
......@@ -15,10 +16,10 @@ class Mapper
:controller, :action, :path_names, :constraints,
:shallow, :blocks, :defaults, :options]
class Constraints #:nodoc:
class Constraints < Endpoint #:nodoc:
attr_reader :app, :constraints
def initialize(app, constraints, request, dispatcher_p, redirect_p)
def initialize(app, constraints, request, dispatcher_p)
# Unwrap Constraints objects. I don't actually think it's possible
# to pass a Constraints object to this constructor, but there were
# multiple places that kept testing children of this object. I
......@@ -29,13 +30,11 @@ def initialize(app, constraints, request, dispatcher_p, redirect_p)
end
@dispatcher = dispatcher_p
@redirect = redirect_p
@app, @constraints, @request = app, constraints, request
end
def dispatcher?; @dispatcher; end
def redirect?; @redirect; end
def matches?(req)
@constraints.all? do |constraint|
......@@ -220,24 +219,21 @@ def normalize_conditions!
end
def app
dispatcher_p = false
redirect = false
# Unwrap any constraints so we can see what's inside for route generation.
# This allows the formatter to skip over any mounted applications or redirects
# that shouldn't be matched when using a url_for without a route name.
if to.respond_to?(:call)
endpoint = to
redirect = Redirect === endpoint
else
dispatcher_p = true
endpoint = dispatcher
end
if blocks.any?
Constraints.new(endpoint, blocks, @set.request_class, dispatcher_p, redirect)
if Redirect === to
to
else
Constraints.new(to, blocks, @set.request_class, false)
end
else
Constraints.new(endpoint, blocks, @set.request_class, dispatcher_p, redirect)
if blocks.any?
Constraints.new(dispatcher, blocks, @set.request_class, true)
else
dispatcher
end
end
end
......
......@@ -3,10 +3,11 @@
require 'active_support/core_ext/array/extract_options'
require 'rack/utils'
require 'action_controller/metal/exceptions'
require 'action_dispatch/routing/endpoint'
module ActionDispatch
module Routing
class Redirect # :nodoc:
class Redirect < Endpoint # :nodoc:
attr_reader :status, :block
def initialize(status, block)
......@@ -14,9 +15,13 @@ def initialize(status, block)
@block = block
end
def redirect?; true; end
def call(env)
req = Request.new(env)
serve Request.new env
end
def serve(req)
# If any of the path parameters has an invalid encoding then
# raise since it's likely to trigger errors further on.
req.path_parameters.each do |key, value|
......
......@@ -8,6 +8,7 @@
require 'active_support/core_ext/array/extract_options'
require 'action_controller/metal/exceptions'
require 'action_dispatch/http/request'
require 'action_dispatch/routing/endpoint'
module ActionDispatch
module Routing
......@@ -20,14 +21,20 @@ class RouteSet #:nodoc:
PARAMETERS_KEY = 'action_dispatch.request.path_parameters'
class Dispatcher #:nodoc:
class Dispatcher < Routing::Endpoint #:nodoc:
def initialize(defaults)
@defaults = defaults
@controller_class_names = ThreadSafe::Cache.new
end
def dispatcher?; true; end
def call(env)
params = env[PARAMETERS_KEY]
serve Request.new env
end
def serve(req)
params = req.path_parameters
# If any of the path parameters has an invalid encoding then
# raise since it's likely to trigger errors further on.
......@@ -46,7 +53,7 @@ def call(env)
return [404, {'X-Cascade' => 'pass'}, []]
end
dispatch(controller, params[:action], env)
dispatch(controller, params[:action], req.env)
end
def prepare_params!(params)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册