Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Refactor Generator class to not rely on in-place editing the controller

  • Loading branch information...
commit 0c7a236f30c12c981cf376d08ac01e423308533d 1 parent 09c4dfa
@pixeltrix pixeltrix authored carlosantoniodasilva committed
View
15 actionpack/lib/action_dispatch/routing/route_set.rb
@@ -442,12 +442,12 @@ def initialize(options, recall, set, extras = false)
normalize_options!
normalize_controller_action_id!
use_relative_controller!
- controller.sub!(%r{^/}, '') if controller
+ normalize_controller!
handle_nil_action!
end
def controller
- @controller ||= @options[:controller]
+ @options[:controller]
end
def current_controller
@@ -476,11 +476,11 @@ def normalize_options!
if options[:controller]
options[:action] ||= 'index'
- options[:controller] = options[:controller].to_s.dup
+ options[:controller] = options[:controller].to_s
end
if options[:action]
- options[:action] = options[:action].to_s.dup
+ options[:action] = options[:action].to_s
end
end
@@ -504,10 +504,15 @@ def use_relative_controller!
old_parts = current_controller.split('/')
size = controller.count("/") + 1
parts = old_parts[0...-size] << controller
- @controller = @options[:controller] = parts.join("/")
+ @options[:controller] = parts.join("/")
end
end
+ # Remove leading slashes from controllers
+ def normalize_controller!
+ @options[:controller] = controller.sub(%r{^/}, '') if controller
+ end
+
# This handles the case of :action => nil being explicitly passed.
# It is identical to :action => "index"
def handle_nil_action!
View
12 actionpack/test/dispatch/routing_test.rb
@@ -887,13 +887,13 @@ def test_url_for_with_no_side_effects
assert_equal original_options, options
end
- # checks that url_for doesn't change controller and action
- def test_url_for_with_no_side_effects_on_strings
- # freeze controller and action to be sure they are not changed
- # we'll get RuntimeError if somebody tries to modify them
- options = {:controller => '/projects'.freeze, :action => 'status'.freeze}
+ def test_url_for_does_not_modify_controller
+ controller = '/projects'
+ options = {:controller => controller, :action => 'status', :only_path => true}
+ url = url_for(options)
- url_for options
+ assert_equal '/projects/status', url
+ assert_equal '/projects', controller
end
# tests the arguments modification free version of define_hash_access
Please sign in to comment.
Something went wrong with that request. Please try again.