Skip to content

Commit

Permalink
pull via all the way out of add_route
Browse files Browse the repository at this point in the history
  • Loading branch information
tenderlove committed Aug 12, 2015
1 parent b106ddd commit b46c67f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 11 deletions.
23 changes: 12 additions & 11 deletions actionpack/lib/action_dispatch/routing/mapper.rb
Expand Up @@ -72,6 +72,7 @@ def self.build(scope, set, path, as, controller, default_action, to, via, option
options.delete :shallow_prefix
options.delete :shallow
options.delete :format
options.delete :via

defaults = (scope[:defaults] || {}).dup
scope_constraints = scope[:constraints] || {}
Expand Down Expand Up @@ -1539,29 +1540,30 @@ def match(path, *rest)
controller = options.delete(:controller) || @scope[:controller]
option_path = options.delete :path
to = options.delete :to
via = Array(options.delete(:via) { (@scope[:options] || {})[:via] })

path_types = paths.group_by(&:class)
path_types.fetch(String, []).each do |_path|
route_options = options.dup
process_path(route_options, controller, _path, option_path || _path, to)
process_path(route_options, controller, _path, option_path || _path, to, via)
end

path_types.fetch(Symbol, []).each do |action|
route_options = options.dup
decomposed_match(action, controller, route_options, option_path, to)
decomposed_match(action, controller, route_options, option_path, to, via)
end

self
end

def process_path(options, controller, path, option_path, to)
def process_path(options, controller, path, option_path, to, via)
path_without_format = path.sub(/\(\.:format\)$/, '')
if using_match_shorthand?(path_without_format, to, options[:action])
to ||= path_without_format.gsub(%r{^/}, "").sub(%r{/([^/]*)$}, '#\1')
to.tr!("-", "_")
end

decomposed_match(path, controller, options, option_path, to)
decomposed_match(path, controller, options, option_path, to, via)
end

def using_match_shorthand?(path, to, action)
Expand All @@ -1570,22 +1572,22 @@ def using_match_shorthand?(path, to, action)
path =~ %r{^/?[-\w]+/[-\w/]+$}
end

def decomposed_match(path, controller, options, _path, to) # :nodoc:
def decomposed_match(path, controller, options, _path, to, via) # :nodoc:
if on = options.delete(:on)
send(on) { decomposed_match(path, controller, options, _path, to) }
send(on) { decomposed_match(path, controller, options, _path, to, via) }
else
case @scope.scope_level
when :resources
nested { decomposed_match(path, controller, options, _path, to) }
nested { decomposed_match(path, controller, options, _path, to, via) }
when :resource
member { decomposed_match(path, controller, options, _path, to) }
member { decomposed_match(path, controller, options, _path, to, via) }
else
add_route(path, controller, options, _path, to)
add_route(path, controller, options, _path, to, via)
end
end
end

def add_route(action, controller, options, _path, to) # :nodoc:
def add_route(action, controller, options, _path, to, via) # :nodoc:
path = path_for_action(action, _path)
raise ArgumentError, "path is required" if path.blank?

Expand All @@ -1605,7 +1607,6 @@ def add_route(action, controller, options, _path, to) # :nodoc:
name_for_action(options.delete(:as), action)
end

via = Array(options.delete(:via) { (@scope[:options] || {})[:via] })
mapping = Mapping.build(@scope, @set, URI.parser.escape(path), as, controller, default_action, to, via, options)
app, conditions, requirements, defaults, as, anchor = mapping.to_route
@set.add_route(app, conditions, requirements, defaults, as, anchor)
Expand Down
8 changes: 8 additions & 0 deletions actionpack/test/dispatch/mapper_test.rb
Expand Up @@ -40,6 +40,14 @@ def test_initialize
Mapper.new FakeSet.new
end

def test_blows_up_without_via
fakeset = FakeSet.new
mapper = Mapper.new fakeset
assert_raises(ArgumentError) do
mapper.match '/', :to => 'posts#index', :as => :main
end
end

def test_mapping_requirements
options = { }
m = Mapper::Mapping.build({}, FakeSet.new, '/store/:name(*rest)', nil, 'foo', 'bar', nil, [:get], options)
Expand Down

0 comments on commit b46c67f

Please sign in to comment.