mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
give all endpoints a superclass
This commit is contained in:
parent
40514aa23a
commit
402c2af550
4 changed files with 41 additions and 23 deletions
10
actionpack/lib/action_dispatch/routing/endpoint.rb
Normal file
10
actionpack/lib/action_dispatch/routing/endpoint.rb
Normal file
|
@ -0,0 +1,10 @@
|
|||
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/array/extract_options'
|
|||
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 @@ module ActionDispatch
|
|||
: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 @@ module ActionDispatch
|
|||
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 @@ module ActionDispatch
|
|||
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
|
||||
if Redirect === to
|
||||
to
|
||||
else
|
||||
Constraints.new(to, blocks, @set.request_class, false)
|
||||
end
|
||||
else
|
||||
dispatcher_p = true
|
||||
endpoint = dispatcher
|
||||
end
|
||||
|
||||
if blocks.any?
|
||||
Constraints.new(endpoint, blocks, @set.request_class, dispatcher_p, redirect)
|
||||
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/uri'
|
|||
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 @@ module ActionDispatch
|
|||
@block = block
|
||||
end
|
||||
|
||||
def call(env)
|
||||
req = Request.new(env)
|
||||
def redirect?; true; end
|
||||
|
||||
def call(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/module/remove_method'
|
|||
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 @@ module ActionDispatch
|
|||
|
||||
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 @@ module ActionDispatch
|
|||
return [404, {'X-Cascade' => 'pass'}, []]
|
||||
end
|
||||
|
||||
dispatch(controller, params[:action], env)
|
||||
dispatch(controller, params[:action], req.env)
|
||||
end
|
||||
|
||||
def prepare_params!(params)
|
||||
|
|
Loading…
Reference in a new issue