From decff3f43e5549cbc8b89f974460de3d71407042 Mon Sep 17 00:00:00 2001 From: Vasiliy Ermolovich Date: Mon, 20 Feb 2012 22:55:46 +0300 Subject: refactor options_for_select --- .../lib/action_view/helpers/form_options_helper.rb | 15 +++++----- .../test/template/form_options_helper_test.rb | 32 +++++++++++----------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/actionpack/lib/action_view/helpers/form_options_helper.rb b/actionpack/lib/action_view/helpers/form_options_helper.rb index 39cd63074b..abb548c276 100644 --- a/actionpack/lib/action_view/helpers/form_options_helper.rb +++ b/actionpack/lib/action_view/helpers/form_options_helper.rb @@ -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) - %() + + 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 @@ -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) diff --git a/actionpack/test/template/form_options_helper_test.rb b/actionpack/test/template/form_options_helper_test.rb index bed67e35b3..6b8d62df62 100644 --- a/actionpack/test/template/form_options_helper_test.rb +++ b/actionpack/test/template/form_options_helper_test.rb @@ -182,16 +182,16 @@ class FormOptionsHelperTest < ActionView::TestCase def test_hash_options_for_select assert_dom_equal( - "\n", - options_for_select("$" => "Dollar", "" => "").split("\n").sort.join("\n") + "\n", + options_for_select("$" => "Dollar", "" => "").split("\n").join("\n") ) assert_dom_equal( - "\n", - options_for_select({ "$" => "Dollar", "" => "" }, "Dollar").split("\n").sort.join("\n") + "\n", + options_for_select({ "$" => "Dollar", "" => "" }, "Dollar").split("\n").join("\n") ) assert_dom_equal( - "\n", - options_for_select({ "$" => "Dollar", "" => "" }, [ "Dollar", "" ]).split("\n").sort.join("\n") + "\n", + options_for_select({ "$" => "Dollar", "" => "" }, [ "Dollar", "" ]).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("")) } ]) ) end -- cgit v1.2.3