Skip to content

Commit

Permalink
Fix input value not properly applied:
Browse files Browse the repository at this point in the history
- #37872 introduced a regression and you can't do

  ```html.erb
    hidden_field_tag('token', value: [1, 2, 3])
  ```

  This will result in a `<input type="hidden" value=""`>.

  I chose `hidden_field_tag` and the `value` attribute as an example
  but this issue applies to any tag helper and any attributes.

  #37872 (comment)
  mention that the feature should only apply for "class" attribute.

  This commit fix original intent of #37872
  • Loading branch information
Edouard-chin committed Dec 9, 2019
1 parent 7f4d222 commit 95bc8d0
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
6 changes: 3 additions & 3 deletions actionview/lib/action_view/helpers/tag_helper.rb
Expand Up @@ -94,7 +94,7 @@ def boolean_tag_option(key)
def tag_option(key, value, escape)
case value
when Array, Hash
value = build_tag_values(value)
value = build_tag_values(value) if key.to_s == "class"
value = escape ? safe_join(value, " ") : value.join(" ")
else
value = escape ? ERB::Util.unwrapped_html_escape(value) : value.to_s
Expand All @@ -109,14 +109,14 @@ def build_tag_values(*args)

args.each do |tag_value|
case tag_value
when String
tag_values << tag_value if tag_value.present?
when Hash
tag_value.each do |key, val|
tag_values << key if val
end
when Array
tag_values << build_tag_values(*tag_value).presence
else
tag_values << tag_value.to_s if tag_value.present?
end
end

Expand Down
30 changes: 30 additions & 0 deletions actionview/test/template/tag_helper_test.rb
Expand Up @@ -37,6 +37,24 @@ def test_tag_options
assert_match(/class="elsewhere"/, str)
end

def test_tag_options_with_array_of_numeric
str = tag(:input, value: [123, 456])

assert_equal("<input value=\"123 456\" />", str)
end

def test_tag_options_with_array_of_random_objects
klass = Class.new do
def to_s
"hello"
end
end

str = tag(:input, value: [klass.new])

assert_equal("<input value=\"hello\" />", str)
end

def test_tag_options_rejects_nil_option
assert_equal "<p />", tag("p", ignored: nil)
end
Expand Down Expand Up @@ -262,6 +280,18 @@ def test_content_tag_with_conditional_hash_classes
str = content_tag("p", "limelight", class: ["song", { foo: false }])
assert_equal "<p class=\"song\">limelight</p>", str

str = content_tag("p", "limelight", class: [1, 2, 3])
assert_equal "<p class=\"1 2 3\">limelight</p>", str

klass = Class.new do
def to_s
"1"
end
end

str = content_tag("p", "limelight", class: [klass.new])
assert_equal "<p class=\"1\">limelight</p>", str

str = content_tag("p", "limelight", class: { "song": true, "play": true })
assert_equal "<p class=\"song play\">limelight</p>", str

Expand Down

0 comments on commit 95bc8d0

Please sign in to comment.