aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Ognevsky <a.ognevsky@gmail.com>2013-11-13 00:18:36 +0400
committerAndrey Ognevsky <a.ognevsky@gmail.com>2013-11-15 15:50:42 +0400
commitd04c4fac3bb6f75ba15704dd03faeb5f2d7033f7 (patch)
tree9f3ac29a96684d6a9b4eb4002f87e34ee5588c3d
parent77ed4d98a7147fcfa1c340385f767a0010abe82a (diff)
downloadrails-d04c4fac3bb6f75ba15704dd03faeb5f2d7033f7.tar.gz
rails-d04c4fac3bb6f75ba15704dd03faeb5f2d7033f7.tar.bz2
rails-d04c4fac3bb6f75ba15704dd03faeb5f2d7033f7.zip
Take Hash with options inside Array in #url_for
-rw-r--r--actionpack/CHANGELOG.md9
-rw-r--r--actionpack/lib/action_dispatch/routing/url_for.rb2
-rw-r--r--actionpack/test/controller/url_for_test.rb18
-rw-r--r--actionview/lib/action_view/routing_url_for.rb2
4 files changed, 31 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md
index dea80abfcd..93aaa9ab57 100644
--- a/actionpack/CHANGELOG.md
+++ b/actionpack/CHANGELOG.md
@@ -1,3 +1,12 @@
+* Take a hash with options inside array in #url_for
+
+ Example:
+
+ url_for [:new, :admin, :post, { param: 'value' }]
+ # => http://example.com/admin/posts/new?params=value
+
+ *Andrey Ognevsky*
+
* Add `session#fetch` method
fetch behaves similarly to [Hash#fetch](http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-fetch),
diff --git a/actionpack/lib/action_dispatch/routing/url_for.rb b/actionpack/lib/action_dispatch/routing/url_for.rb
index bcebe532bf..4a0ef40873 100644
--- a/actionpack/lib/action_dispatch/routing/url_for.rb
+++ b/actionpack/lib/action_dispatch/routing/url_for.rb
@@ -155,6 +155,8 @@ module ActionDispatch
_routes.url_for(options.symbolize_keys.reverse_merge!(url_options))
when String
options
+ when Array
+ polymorphic_url(options, options.extract_options!)
else
polymorphic_url(options)
end
diff --git a/actionpack/test/controller/url_for_test.rb b/actionpack/test/controller/url_for_test.rb
index 088ad73f2f..d2b4952759 100644
--- a/actionpack/test/controller/url_for_test.rb
+++ b/actionpack/test/controller/url_for_test.rb
@@ -370,6 +370,24 @@ module AbstractController
assert_equal("/c/a?show=false", W.new.url_for(:only_path => true, :controller => 'c', :action => 'a', :show => false))
end
+ def test_url_generation_with_array_and_hash
+ with_routing do |set|
+ set.draw do
+ namespace :admin do
+ resources :posts
+ end
+ end
+
+ kls = Class.new { include set.url_helpers }
+ kls.default_url_options[:host] = 'www.basecamphq.com'
+
+ controller = kls.new
+ assert_equal("http://www.basecamphq.com/admin/posts/new?param=value",
+ controller.send(:url_for, [:new, :admin, :post, { param: 'value' }])
+ )
+ end
+ end
+
private
def extract_params(url)
url.split('?', 2).last.split('&').sort
diff --git a/actionview/lib/action_view/routing_url_for.rb b/actionview/lib/action_view/routing_url_for.rb
index f10e7e88ba..33be06cbf7 100644
--- a/actionview/lib/action_view/routing_url_for.rb
+++ b/actionview/lib/action_view/routing_url_for.rb
@@ -83,6 +83,8 @@ module ActionView
super
when :back
_back_url
+ when Array
+ polymorphic_path(options, options.extract_options!)
else
polymorphic_path(options)
end