aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2016-02-19 15:59:09 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2016-02-19 15:59:09 -0800
commit0c9f5f56f7a1628c8c9ff3a91a52f17a15e31b26 (patch)
tree3818883184b07c64ba7e96f88cfc0f8734e54405 /actionview/lib
parent8a5059383e7bf4bfe0bfd308ab511d578b1a6ce8 (diff)
parent2df891dccdcfbdfb176c55297589712ac379f87d (diff)
downloadrails-0c9f5f56f7a1628c8c9ff3a91a52f17a15e31b26.tar.gz
rails-0c9f5f56f7a1628c8c9ff3a91a52f17a15e31b26.tar.bz2
rails-0c9f5f56f7a1628c8c9ff3a91a52f17a15e31b26.zip
Merge branch 'master' into treewip
* master: eliminate warnings about multiple primary keys on habtm join tables Add methods to array delegation from `Relation` Fix button_to's params option to support nested names. Dependencies clean up Deprecate AC::Parameters#== with a Hash Fix AC::Parameters#== with other AC::Parameters Tests for AC::Parameters#== better docs for ActiveSupport::TestCase#assert_nothing_raised remove needless `debug_exception_response_format` config [ci skip] partial pass over the API guide [ci skip] Fix `unsubscribed` server side behavior Use a semaphore to signal message availability Fix master build Remove github gems from the master bug report templates Truncate ActionCable broadcast message to 300 chars Remove unused require
Diffstat (limited to 'actionview/lib')
-rw-r--r--actionview/lib/action_view/helpers/url_helper.rb40
1 files changed, 38 insertions, 2 deletions
diff --git a/actionview/lib/action_view/helpers/url_helper.rb b/actionview/lib/action_view/helpers/url_helper.rb
index 3a4561a083..87218821ed 100644
--- a/actionview/lib/action_view/helpers/url_helper.rb
+++ b/actionview/lib/action_view/helpers/url_helper.rb
@@ -329,8 +329,8 @@ module ActionView
inner_tags = method_tag.safe_concat(button).safe_concat(request_token_tag)
if params
- params.each do |param_name, value|
- inner_tags.safe_concat tag(:input, type: "hidden", name: param_name, value: value.to_param)
+ to_form_params(params).each do |param|
+ inner_tags.safe_concat tag(:input, type: "hidden", name: param[:name], value: param[:value])
end
end
content_tag('form', inner_tags, form_options)
@@ -595,6 +595,42 @@ module ActionView
def method_tag(method)
tag('input', type: 'hidden', name: '_method', value: method.to_s)
end
+
+ # Returns an array of hashes each containing :name and :value keys
+ # suitable for use as the names and values of form input fields:
+ #
+ # to_form_params(name: 'David', nationality: 'Danish')
+ # # => [{name: :name, value: 'David'}, {name: 'nationality', value: 'Danish'}]
+ #
+ # to_form_params(country: {name: 'Denmark'})
+ # # => [{name: 'country[name]', value: 'Denmark'}]
+ #
+ # to_form_params(countries: ['Denmark', 'Sweden']})
+ # # => [{name: 'countries[]', value: 'Denmark'}, {name: 'countries[]', value: 'Sweden'}]
+ #
+ # An optional namespace can be passed to enclose key names:
+ #
+ # to_form_params({ name: 'Denmark' }, 'country')
+ # # => [{name: 'country[name]', value: 'Denmark'}]
+ def to_form_params(attribute, namespace = nil) # :nodoc:
+ params = []
+ case attribute
+ when Hash
+ attribute.each do |key, value|
+ prefix = namespace ? "#{namespace}[#{key}]" : key
+ params.push(*to_form_params(value, prefix))
+ end
+ when Array
+ array_prefix = "#{namespace}[]"
+ attribute.each do |value|
+ params.push(*to_form_params(value, array_prefix))
+ end
+ else
+ params << { name: namespace, value: attribute.to_param }
+ end
+
+ params.sort_by { |pair| pair[:name] }
+ end
end
end
end