提交 4c5846f1 编写于 作者: R Rafael França

Merge pull request #17043 from jcoleman/fix-nested-params-in-button-to

Fix button_to's params option to support nested names.
* Fix `button_to`'s `:params` option support to correctly generated input names for nested hashes/arrays.
*James Coleman*
## Rails 5.0.0.beta2 (February 01, 2016) ##
* Fix stripping the digest from the automatically generated img tag alt
......
......@@ -329,8 +329,8 @@ def button_to(name = nil, options = nil, html_options = nil, &block)
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 @@ def token_tag(token=nil, form_options: {})
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
......@@ -71,6 +71,34 @@ def test_url_for_with_invalid_referer
assert_equal 'javascript:history.back()', url_for(:back)
end
def test_to_form_params_with_hash
assert_equal(
[{ name: :name, value: 'David' }, { name: :nationality, value: 'Danish' }],
to_form_params(name: 'David', nationality: 'Danish')
)
end
def test_to_form_params_with_nested_hash
assert_equal(
[{ name: 'country[name]', value: 'Denmark' }],
to_form_params(country: { name: 'Denmark' })
)
end
def test_to_form_params_with_array_nested_in_hash
assert_equal(
[{ name: 'countries[]', value: 'Denmark' }, { name: 'countries[]', value: 'Sweden' }],
to_form_params(countries: ['Denmark', 'Sweden'])
)
end
def test_to_form_params_with_namespace
assert_equal(
[{ name: 'country[name]', value: 'Denmark' }],
to_form_params({name: 'Denmark'}, 'country')
)
end
def test_button_to_with_straight_url
assert_dom_equal %{<form method="post" action="http://www.example.com" class="button_to"><input type="submit" value="Hello" /></form>}, button_to("Hello", "http://www.example.com")
end
......@@ -189,8 +217,22 @@ def test_button_to_with_block
def test_button_to_with_params
assert_dom_equal(
%{<form action="http://www.example.com" class="button_to" method="post"><input type="submit" value="Hello" /><input type="hidden" name="foo" value="bar" /><input type="hidden" name="baz" value="quux" /></form>},
button_to("Hello", "http://www.example.com", params: {foo: :bar, baz: "quux"})
%{<form action="http://www.example.com" class="button_to" method="post"><input type="submit" value="Hello" /><input type="hidden" name="baz" value="quux" /><input type="hidden" name="foo" value="bar" /></form>},
button_to("Hello", "http://www.example.com", params: { foo: :bar, baz: "quux" })
)
end
def test_button_to_with_nested_hash_params
assert_dom_equal(
%{<form action="http://www.example.com" class="button_to" method="post"><input type="submit" value="Hello" /><input type="hidden" name="foo[bar]" value="baz" /></form>},
button_to("Hello", "http://www.example.com", params: { foo: { bar: 'baz' } })
)
end
def test_button_to_with_nested_array_params
assert_dom_equal(
%{<form action="http://www.example.com" class="button_to" method="post"><input type="submit" value="Hello" /><input type="hidden" name="foo[]" value="bar" /></form>},
button_to("Hello", "http://www.example.com", params: { foo: ['bar'] })
)
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册