diff options
-rw-r--r-- | actionpack/lib/action_controller/routing.rb | 5 | ||||
-rw-r--r-- | actionpack/test/controller/routing_test.rb | 11 |
2 files changed, 15 insertions, 1 deletions
diff --git a/actionpack/lib/action_controller/routing.rb b/actionpack/lib/action_controller/routing.rb index d69c862989..8673412401 100644 --- a/actionpack/lib/action_controller/routing.rb +++ b/actionpack/lib/action_controller/routing.rb @@ -245,12 +245,15 @@ module ActionController start = "(#{start})" unless /^\w+$/ =~ start value_expr = "#{g.path_name}[#{start}..-1] || []" - g.result key, "ActionController::Routing::PathComponent::Result.new(#{value_expr})" + g.result key, "ActionController::Routing::PathComponent::Result.new_escaped(#{value_expr})" g.finish(false) end class Result < ::Array def to_s() join '/' end + def self.new_escaped(strings) + new strings.collect {|str| CGI.unescape str} + end end end diff --git a/actionpack/test/controller/routing_test.rb b/actionpack/test/controller/routing_test.rb index 48151ba198..38b995dc6e 100644 --- a/actionpack/test/controller/routing_test.rb +++ b/actionpack/test/controller/routing_test.rb @@ -693,6 +693,17 @@ class RouteSetTests < Test::Unit::TestCase ) end + def test_paths_escaped + rs.draw do |map| + rs.path 'file/*path', :controller => 'content', :action => 'show_file' + rs.connect ':controller/:action/:id' + end + + results = rs.recognize_path %w(file hello+world how+are+you%3F) + assert results, "Recognition should have succeeded" + assert_equal ['hello world', 'how are you?'], results['path'] + end + def test_backwards rs.draw do |map| rs.connect 'page/:id/:action', :controller => 'pages', :action => 'show' |