mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #5102 from nashby/form-option-refactor
form option refactor
This commit is contained in:
commit
4b45fcffea
2 changed files with 29 additions and 28 deletions
|
@ -330,9 +330,12 @@ module ActionView
|
|||
container.map do |element|
|
||||
html_attributes = option_html_attributes(element)
|
||||
text, value = option_text_and_value(element).map { |item| item.to_s }
|
||||
selected_attribute = ' selected="selected"' if option_value_selected?(value, selected)
|
||||
disabled_attribute = ' disabled="disabled"' if disabled && option_value_selected?(value, disabled)
|
||||
%(<option value="#{ERB::Util.html_escape(value)}"#{selected_attribute}#{disabled_attribute}#{html_attributes}>#{ERB::Util.html_escape(text)}</option>)
|
||||
|
||||
html_attributes[:selected] = 'selected' if option_value_selected?(value, selected)
|
||||
html_attributes[:disabled] = 'disabled' if disabled && option_value_selected?(value, disabled)
|
||||
html_attributes[:value] = value
|
||||
|
||||
content_tag(:option, text, html_attributes)
|
||||
end.join("\n").html_safe
|
||||
end
|
||||
|
||||
|
@ -472,16 +475,16 @@ module ActionView
|
|||
# <b>Note:</b> Only the <tt><optgroup></tt> and <tt><option></tt> tags are returned, so you still have to
|
||||
# wrap the output in an appropriate <tt><select></tt> tag.
|
||||
def grouped_options_for_select(grouped_options, selected_key = nil, prompt = nil)
|
||||
body = ''
|
||||
body << content_tag(:option, prompt, { :value => "" }, true) if prompt
|
||||
body = "".html_safe
|
||||
body.safe_concat content_tag(:option, prompt, :value => "") if prompt
|
||||
|
||||
grouped_options = grouped_options.sort if grouped_options.is_a?(Hash)
|
||||
|
||||
grouped_options.each do |group|
|
||||
body << content_tag(:optgroup, options_for_select(group[1], selected_key), :label => group[0])
|
||||
grouped_options.each do |label, container|
|
||||
body.safe_concat content_tag(:optgroup, options_for_select(container, selected_key), :label => label)
|
||||
end
|
||||
|
||||
body.html_safe
|
||||
body
|
||||
end
|
||||
|
||||
# Returns a string of option tags for pretty much any time zone in the
|
||||
|
@ -649,11 +652,9 @@ module ActionView
|
|||
|
||||
private
|
||||
def option_html_attributes(element)
|
||||
return "" unless Array === element
|
||||
return {} unless Array === element
|
||||
|
||||
element.select { |e| Hash === e }.reduce({}, :merge).map do |k, v|
|
||||
" #{k}=\"#{ERB::Util.html_escape(v.to_s)}\""
|
||||
end.join
|
||||
Hash[element.select { |e| Hash === e }.reduce({}, :merge).map { |k, v| [k, ERB::Util.html_escape(v.to_s)] }]
|
||||
end
|
||||
|
||||
def option_text_and_value(option)
|
||||
|
|
|
@ -182,16 +182,16 @@ class FormOptionsHelperTest < ActionView::TestCase
|
|||
|
||||
def test_hash_options_for_select
|
||||
assert_dom_equal(
|
||||
"<option value=\"<Kroner>\"><DKR></option>\n<option value=\"Dollar\">$</option>",
|
||||
options_for_select("$" => "Dollar", "<DKR>" => "<Kroner>").split("\n").sort.join("\n")
|
||||
"<option value=\"Dollar\">$</option>\n<option value=\"<Kroner>\"><DKR></option>",
|
||||
options_for_select("$" => "Dollar", "<DKR>" => "<Kroner>").split("\n").join("\n")
|
||||
)
|
||||
assert_dom_equal(
|
||||
"<option value=\"<Kroner>\"><DKR></option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
|
||||
options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, "Dollar").split("\n").sort.join("\n")
|
||||
"<option value=\"Dollar\" selected=\"selected\">$</option>\n<option value=\"<Kroner>\"><DKR></option>",
|
||||
options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, "Dollar").split("\n").join("\n")
|
||||
)
|
||||
assert_dom_equal(
|
||||
"<option value=\"<Kroner>\" selected=\"selected\"><DKR></option>\n<option value=\"Dollar\" selected=\"selected\">$</option>",
|
||||
options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, [ "Dollar", "<Kroner>" ]).split("\n").sort.join("\n")
|
||||
"<option value=\"Dollar\" selected=\"selected\">$</option>\n<option value=\"<Kroner>\" selected=\"selected\"><DKR></option>",
|
||||
options_for_select({ "$" => "Dollar", "<DKR>" => "<Kroner>" }, [ "Dollar", "<Kroner>" ]).split("\n").join("\n")
|
||||
)
|
||||
end
|
||||
|
||||
|
@ -1056,36 +1056,36 @@ class FormOptionsHelperTest < ActionView::TestCase
|
|||
end
|
||||
|
||||
def test_option_html_attributes_from_without_hash
|
||||
assert_dom_equal(
|
||||
"",
|
||||
assert_equal(
|
||||
{},
|
||||
option_html_attributes([ 'foo', 'bar' ])
|
||||
)
|
||||
end
|
||||
|
||||
def test_option_html_attributes_with_single_element_hash
|
||||
assert_dom_equal(
|
||||
" class=\"fancy\"",
|
||||
assert_equal(
|
||||
{:class => 'fancy'},
|
||||
option_html_attributes([ 'foo', 'bar', { :class => 'fancy' } ])
|
||||
)
|
||||
end
|
||||
|
||||
def test_option_html_attributes_with_multiple_element_hash
|
||||
assert_dom_equal(
|
||||
" class=\"fancy\" onclick=\"alert('Hello World');\"",
|
||||
assert_equal(
|
||||
{:class => 'fancy', 'onclick' => "alert('Hello World');"},
|
||||
option_html_attributes([ 'foo', 'bar', { :class => 'fancy', 'onclick' => "alert('Hello World');" } ])
|
||||
)
|
||||
end
|
||||
|
||||
def test_option_html_attributes_with_multiple_hashes
|
||||
assert_dom_equal(
|
||||
" class=\"fancy\" onclick=\"alert('Hello World');\"",
|
||||
assert_equal(
|
||||
{:class => 'fancy', 'onclick' => "alert('Hello World');"},
|
||||
option_html_attributes([ 'foo', 'bar', { :class => 'fancy' }, { 'onclick' => "alert('Hello World');" } ])
|
||||
)
|
||||
end
|
||||
|
||||
def test_option_html_attributes_with_special_characters
|
||||
assert_dom_equal(
|
||||
" onclick=\"alert("<code>")\"",
|
||||
assert_equal(
|
||||
{:onclick => "alert("<code>")"},
|
||||
option_html_attributes([ 'foo', 'bar', { :onclick => %(alert("<code>")) } ])
|
||||
)
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue