RouteSet should be in charge of constructing the dispather

Now we can override how requests are dispatched in the routeset object
This commit is contained in:
Aaron Patterson 2014-07-01 15:33:30 -07:00
parent 93e09f5278
commit 0777b17daf
3 changed files with 15 additions and 10 deletions

View File

@ -66,7 +66,7 @@ module ActionDispatch
attr_reader :requirements, :conditions, :defaults
attr_reader :to, :default_controller, :default_action, :as, :anchor
def self.build(scope, path, options)
def self.build(scope, set, path, options)
options = scope[:options].merge(options) if scope[:options]
options.delete :only
@ -77,12 +77,13 @@ module ActionDispatch
defaults = (scope[:defaults] || {}).merge options.delete(:defaults) || {}
new scope, path, defaults, options
new scope, set, path, defaults, options
end
def initialize(scope, path, defaults, options)
def initialize(scope, set, path, defaults, options)
@requirements, @conditions = {}, {}
@defaults = defaults
@set = set
@to = options.delete :to
@default_controller = options.delete(:controller) || scope[:controller]
@ -249,9 +250,9 @@ module ActionDispatch
Constraints.new(to, blocks, false)
else
if blocks.any?
Constraints.new(dispatcher, blocks, true)
Constraints.new(dispatcher(defaults), blocks, true)
else
dispatcher
dispatcher(defaults)
end
end
end
@ -348,8 +349,8 @@ module ActionDispatch
parser.parse path
end
def dispatcher
Routing::RouteSet::Dispatcher.new(defaults)
def dispatcher(defaults)
@set.dispatcher defaults
end
end
@ -1551,7 +1552,7 @@ module ActionDispatch
options[:as] = name_for_action(options[:as], action)
end
mapping = Mapping.build(@scope, URI.parser.escape(path), options)
mapping = Mapping.build(@scope, @set, URI.parser.escape(path), options)
app, conditions, requirements, defaults, as, anchor = mapping.to_route
@set.add_route(app, conditions, requirements, defaults, as, anchor)
end

View File

@ -334,6 +334,10 @@ module ActionDispatch
@prepend.each { |blk| eval_block(blk) }
end
def dispatcher(defaults)
Routing::RouteSet::Dispatcher.new(defaults)
end
module MountedHelpers #:nodoc:
extend ActiveSupport::Concern
include UrlFor

View File

@ -3,7 +3,7 @@ require 'abstract_unit'
module ActionDispatch
module Routing
class MapperTest < ActiveSupport::TestCase
class FakeSet
class FakeSet < ActionDispatch::Routing::RouteSet
attr_reader :routes
alias :set :routes
@ -38,7 +38,7 @@ module ActionDispatch
def test_mapping_requirements
options = { :controller => 'foo', :action => 'bar', :via => :get }
m = Mapper::Mapping.build({}, '/store/:name(*rest)', options)
m = Mapper::Mapping.build({}, FakeSet.new, '/store/:name(*rest)', options)
_, _, requirements, _ = m.to_route
assert_equal(/.+?/, requirements[:rest])
end