diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2014-05-19 16:14:47 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2014-05-19 16:14:47 -0700 |
commit | 62d1b330c408813f8115d9e40e24f7801a718444 (patch) | |
tree | a6d4986e6c979071a20421b56e0d3f73d5fd9af7 /actionpack/lib | |
parent | 03035d69e14032a589e9653e3145237b8a9a09be (diff) | |
download | rails-62d1b330c408813f8115d9e40e24f7801a718444.tar.gz rails-62d1b330c408813f8115d9e40e24f7801a718444.tar.bz2 rails-62d1b330c408813f8115d9e40e24f7801a718444.zip |
Revert "Rewrite journey routes formatter for performance"
This reverts commit 5c224de9e110763ec7a0f01f5b604bcf81f40bfb.
Conflicts:
actionpack/lib/action_dispatch/journey/visitors.rb
5c224de9e110763ec7a0f01f5b604bcf81f40bfb introduced a bug in the
formatter. This commit includes a regression test.
Diffstat (limited to 'actionpack/lib')
-rw-r--r-- | actionpack/lib/action_dispatch/journey/visitors.rb | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/actionpack/lib/action_dispatch/journey/visitors.rb b/actionpack/lib/action_dispatch/journey/visitors.rb index d9f634623d..3bee8ec5e0 100644 --- a/actionpack/lib/action_dispatch/journey/visitors.rb +++ b/actionpack/lib/action_dispatch/journey/visitors.rb @@ -107,10 +107,11 @@ module ActionDispatch # Used for formatting urls (url_for) class Formatter < Visitor # :nodoc: - attr_reader :options + attr_reader :options, :consumed def initialize(options) @options = options + @consumed = {} end private @@ -122,41 +123,35 @@ module ActionDispatch Router::Utils.escape_segment(value) end - def visit(node, optional = false) - case node.type - when :LITERAL, :SLASH, :DOT - node.left - when :STAR - visit_STAR(node.left) - when :GROUP - visit(node.left, true) - when :CAT - visit_CAT(node, optional) - when :SYMBOL - visit_SYMBOL(node, node.to_sym) + def visit_GROUP(node) + if consumed == options + nil + else + route = visit(node.left) + route.include?("\0") ? nil : route end end - def visit_CAT(node, optional) - left = visit(node.left, optional) - right = visit(node.right, optional) + def terminal(node) + node.left + end - if optional && !(right && left) - "" - else - [left, right].join - end + def binary(node) + [visit(node.left), visit(node.right)].join end - def visit_STAR(node) - if value = options[node.to_sym] - escape_path(value) - end + def nary(node) + node.children.map { |c| visit(c) }.join end - def visit_SYMBOL(node, name) - if value = options[name] - name == :controller ? escape_path(value) : escape_segment(value) + def visit_SYMBOL(node) + key = node.to_sym + + if value = options[key] + consumed[key] = value + Router::Utils.escape_path(value) + else + "\0" end end end |