Skip to content

Commit

Permalink
select tags coerce the :selected option, options to strings before co…
Browse files Browse the repository at this point in the history
…mparison [#5056 state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information
subbarao authored and josevalim committed Aug 15, 2010
1 parent fd78bb7 commit 54477c9
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 9 deletions.
21 changes: 12 additions & 9 deletions actionpack/lib/action_view/helpers/form_options_helper.rb
Expand Up @@ -298,17 +298,18 @@ def options_for_select(container, selected = nil)
return container if String === container

container = container.to_a if Hash === container
selected, disabled = extract_selected_and_disabled(selected)
selected, disabled = extract_selected_and_disabled(selected).map do | r |
Array.wrap(r).map(&:to_s)
end

options_for_select = container.map do |element|
container.map do |element|
html_attributes = option_html_attributes(element)
text, value = option_text_and_value(element)
text, value = option_text_and_value(element).map(&: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="#{html_escape(value.to_s)}"#{selected_attribute}#{disabled_attribute}#{html_attributes}>#{html_escape(text.to_s)}</option>)
end
%(<option value="#{html_escape(value)}"#{selected_attribute}#{disabled_attribute}#{html_attributes}>#{html_escape(text)}</option>)
end.join("\n").html_safe

options_for_select.join("\n").html_safe
end

# Returns a string of option tags that have been compiled by iterating over the +collection+ and assigning the
Expand Down Expand Up @@ -528,10 +529,12 @@ def option_value_selected?(value, selected)
end

def extract_selected_and_disabled(selected)
if selected.is_a?(Hash)
[selected[:selected], selected[:disabled]]
if selected.is_a?(Proc)
[ selected, nil ]
else
[selected, nil]
selected = Array.wrap(selected)
options = selected.extract_options!.symbolize_keys
[ options[:selected] || selected , options[:disabled] ]
end
end

Expand Down
62 changes: 62 additions & 0 deletions actionpack/test/template/form_options_helper_test.rb
Expand Up @@ -176,6 +176,68 @@ def test_ducktyped_options_for_select
)
end

def test_collection_options_with_preselected_value_as_string_and_option_value_is_integer
albums = [ Album.new(1, "first","rap"), Album.new(2, "second","pop")]
assert_dom_equal(
%(<option selected="selected" value="1">rap</option>\n<option value="2">pop</option>),
options_from_collection_for_select(albums, "id", "genre", :selected => "1")
)
end

def test_collection_options_with_preselected_value_as_integer_and_option_value_is_string
albums = [ Album.new("1", "first","rap"), Album.new("2", "second","pop")]

assert_dom_equal(
%(<option selected="selected" value="1">rap</option>\n<option value="2">pop</option>),
options_from_collection_for_select(albums, "id", "genre", :selected => 1)
)
end

def test_collection_options_with_preselected_value_as_string_and_option_value_is_float
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]

assert_dom_equal(
%(<option value="1.0">rap</option>\n<option value="2.0" selected="selected">pop</option>),
options_from_collection_for_select(albums, "id", "genre", :selected => "2.0")
)
end

def test_collection_options_with_preselected_value_as_nil
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]

assert_dom_equal(
%(<option value="1.0">rap</option>\n<option value="2.0">pop</option>),
options_from_collection_for_select(albums, "id", "genre", :selected => nil)
)
end

def test_collection_options_with_disabled_value_as_nil
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]

assert_dom_equal(
%(<option value="1.0">rap</option>\n<option value="2.0">pop</option>),
options_from_collection_for_select(albums, "id", "genre", :disabled => nil)
)
end

def test_collection_options_with_disabled_value_as_array
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop")]

assert_dom_equal(
%(<option disabled="disabled" value="1.0">rap</option>\n<option disabled="disabled" value="2.0">pop</option>),
options_from_collection_for_select(albums, "id", "genre", :disabled => ["1.0", 2.0])
)
end

def test_collection_options_with_preselected_values_as_string_array_and_option_value_is_float
albums = [ Album.new(1.0, "first","rap"), Album.new(2.0, "second","pop"), Album.new(3.0, "third","country") ]

assert_dom_equal(
%(<option value="1.0" selected="selected">rap</option>\n<option value="2.0">pop</option>\n<option value="3.0" selected="selected">country</option>),
options_from_collection_for_select(albums, "id", "genre", ["1.0","3.0"])
)
end

def test_option_groups_from_collection_for_select
assert_dom_equal(
"<optgroup label=\"&lt;Africa&gt;\"><option value=\"&lt;sa&gt;\">&lt;South Africa&gt;</option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option value=\"dk\" selected=\"selected\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>",
Expand Down

0 comments on commit 54477c9

Please sign in to comment.