aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/routing
diff options
context:
space:
mode:
authorPiotr Sarnacki <drogus@gmail.com>2010-07-14 00:46:42 +0200
committerPiotr Sarnacki <drogus@gmail.com>2010-09-03 22:59:06 +0200
commitb53efd21059b9d829a6617fb5b2dd86754684c60 (patch)
tree37557320c2de88ac084dc45747cdc243c0385ad2 /actionpack/lib/action_dispatch/routing
parentb697ba9fd72ac8701747863b42082e59f13ba678 (diff)
downloadrails-b53efd21059b9d829a6617fb5b2dd86754684c60.tar.gz
rails-b53efd21059b9d829a6617fb5b2dd86754684c60.tar.bz2
rails-b53efd21059b9d829a6617fb5b2dd86754684c60.zip
Extended url_for to handle specifying which router should be used.
A few examples: url_for Blog::Engine, :posts_path url_for Blog::Engine, @post url_for Blog::Engine, :action => "main", :controller => "index"
Diffstat (limited to 'actionpack/lib/action_dispatch/routing')
-rw-r--r--actionpack/lib/action_dispatch/routing/polymorphic_routes.rb2
-rw-r--r--actionpack/lib/action_dispatch/routing/route_set.rb24
-rw-r--r--actionpack/lib/action_dispatch/routing/url_for.rb45
3 files changed, 42 insertions, 29 deletions
diff --git a/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb b/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb
index fb2118a8d7..15ee7c8051 100644
--- a/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb
+++ b/actionpack/lib/action_dispatch/routing/polymorphic_routes.rb
@@ -111,7 +111,7 @@ module ActionDispatch
args.last.kind_of?(Hash) ? args.last.merge!(url_options) : args << url_options
end
- send(named_route, *args)
+ url_for _routes.url_helpers.__send__("hash_for_#{named_route}", *args)
end
# Returns the path component of a URL for the given record. It uses
diff --git a/actionpack/lib/action_dispatch/routing/route_set.rb b/actionpack/lib/action_dispatch/routing/route_set.rb
index 6f182ae652..c94b00257b 100644
--- a/actionpack/lib/action_dispatch/routing/route_set.rb
+++ b/actionpack/lib/action_dispatch/routing/route_set.rb
@@ -158,10 +158,17 @@ module ActionDispatch
# We use module_eval to avoid leaks
@module.module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
- def #{selector}(options = nil) # def hash_for_users_url(options = nil)
- options ? #{options.inspect}.merge(options) : #{options.inspect} # options ? {:only_path=>false}.merge(options) : {:only_path=>false}
- end # end
- protected :#{selector} # protected :hash_for_users_url
+ def #{selector}(*args)
+ options = args.extract_options!
+
+ if args.any?
+ options[:_positional_args] = args
+ options[:_positional_keys] = #{route.segment_keys.inspect}
+ end
+
+ options ? #{options.inspect}.merge(options) : #{options.inspect}
+ end
+ protected :#{selector}
END_EVAL
helpers << selector
end
@@ -185,14 +192,7 @@ module ActionDispatch
@module.module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
def #{selector}(*args)
- options = #{hash_access_method}(args.extract_options!)
-
- if args.any?
- options[:_positional_args] = args
- options[:_positional_keys] = #{route.segment_keys.inspect}
- end
-
- url_for(options)
+ url_for(#{hash_access_method}(*args))
end
END_EVAL
helpers << selector
diff --git a/actionpack/lib/action_dispatch/routing/url_for.rb b/actionpack/lib/action_dispatch/routing/url_for.rb
index 5da41df485..edcb7f9cbe 100644
--- a/actionpack/lib/action_dispatch/routing/url_for.rb
+++ b/actionpack/lib/action_dispatch/routing/url_for.rb
@@ -123,27 +123,40 @@ module ActionDispatch
# url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :anchor => 'ok', :only_path => true # => '/tasks/testing#ok'
# url_for :controller => 'tasks', :action => 'testing', :trailing_slash=>true # => 'http://somehost.org/tasks/testing/'
# url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :number => '33' # => 'http://somehost.org/tasks/testing?number=33'
- def url_for(options = nil)
- case options
- when String
- options
- when nil, Hash
- routes = (options ? options.delete(:routes) : nil) || _routes
-
- _with_routes(routes) do
- routes.url_for((options || {}).reverse_merge!(url_options).symbolize_keys)
+ def url_for(*args)
+ if args.first.respond_to?(:routes)
+ app = args.shift
+ _with_routes(app.routes) do
+ if args.first.is_a? Symbol
+ named_route = args.shift
+ url_for _routes.url_helpers.__send__("hash_for_#{named_route}", *args)
+ else
+ url_for(*args)
+ end
end
else
- polymorphic_url(options)
+ options = args.first
+ case options
+ when String
+ options
+ when nil, Hash
+ routes = (options ? options.delete(:routes) : nil) || _routes
+ _with_routes(routes) do
+ routes.url_for((options || {}).reverse_merge!(url_options).symbolize_keys)
+ end
+ else
+ polymorphic_url(options)
+ end
end
end
- def _with_routes(routes)
- old_routes, @_routes = @_routes, routes
- yield
- ensure
- @_routes = old_routes
- end
+ protected
+ def _with_routes(routes)
+ old_routes, @_routes = @_routes, routes
+ yield
+ ensure
+ @_routes = old_routes
+ end
end
end
end