提交 d4a4a6f1 编写于 作者: Y Yurii Cherniavskyi

Fix leaking special form_with attributes into html attributes

Special form_with attributes `skip_default_ids` and `allow_method_names_outside_object`
attributes are leaking into html attributes of option select tag helpers.
上级 7b3ead3b
......@@ -1658,6 +1658,7 @@ def initialize(object_name, object, template, options)
@nested_child_index = {}
@object_name, @object, @template, @options = object_name, object, template, options
@default_options = @options ? @options.slice(:index, :namespace, :skip_default_ids, :allow_method_names_outside_object) : {}
@default_html_options = @default_options.except(:skip_default_ids, :allow_method_names_outside_object)
convert_to_legacy_options(@options)
......
......@@ -820,7 +820,7 @@ class FormBuilder
#
# Please refer to the documentation of the base helper for details.
def select(method, choices = nil, options = {}, html_options = {}, &block)
@template.select(@object_name, method, choices, objectify_options(options), @default_options.merge(html_options), &block)
@template.select(@object_name, method, choices, objectify_options(options), @default_html_options.merge(html_options), &block)
end
# Wraps ActionView::Helpers::FormOptionsHelper#collection_select for form builders:
......@@ -832,7 +832,7 @@ def select(method, choices = nil, options = {}, html_options = {}, &block)
#
# Please refer to the documentation of the base helper for details.
def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
@template.collection_select(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_options.merge(html_options))
@template.collection_select(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options))
end
# Wraps ActionView::Helpers::FormOptionsHelper#grouped_collection_select for form builders:
......@@ -844,7 +844,7 @@ def collection_select(method, collection, value_method, text_method, options = {
#
# Please refer to the documentation of the base helper for details.
def grouped_collection_select(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
@template.grouped_collection_select(@object_name, method, collection, group_method, group_label_method, option_key_method, option_value_method, objectify_options(options), @default_options.merge(html_options))
@template.grouped_collection_select(@object_name, method, collection, group_method, group_label_method, option_key_method, option_value_method, objectify_options(options), @default_html_options.merge(html_options))
end
# Wraps ActionView::Helpers::FormOptionsHelper#time_zone_select for form builders:
......@@ -856,7 +856,7 @@ def grouped_collection_select(method, collection, group_method, group_label_meth
#
# Please refer to the documentation of the base helper for details.
def time_zone_select(method, priority_zones = nil, options = {}, html_options = {})
@template.time_zone_select(@object_name, method, priority_zones, objectify_options(options), @default_options.merge(html_options))
@template.time_zone_select(@object_name, method, priority_zones, objectify_options(options), @default_html_options.merge(html_options))
end
# Wraps ActionView::Helpers::FormOptionsHelper#collection_check_boxes for form builders:
......@@ -868,7 +868,7 @@ def time_zone_select(method, priority_zones = nil, options = {}, html_options =
#
# Please refer to the documentation of the base helper for details.
def collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
@template.collection_check_boxes(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_options.merge(html_options), &block)
@template.collection_check_boxes(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options), &block)
end
# Wraps ActionView::Helpers::FormOptionsHelper#collection_radio_buttons for form builders:
......@@ -880,7 +880,7 @@ def collection_check_boxes(method, collection, value_method, text_method, option
#
# Please refer to the documentation of the base helper for details.
def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
@template.collection_radio_buttons(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_options.merge(html_options), &block)
@template.collection_radio_buttons(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options), &block)
end
end
end
......
......@@ -8,7 +8,7 @@ def initialize(object_name, method_name, template_object, choices, options, html
@choices = block_given? ? template_object.capture { yield || "" } : choices
@choices = @choices.to_a if @choices.is_a?(Range)
@html_options = html_options.except(:skip_default_ids, :allow_method_names_outside_object)
@html_options = html_options
super(object_name, method_name, template_object, options)
end
......
......@@ -464,6 +464,23 @@ def test_form_with_doesnt_call_private_or_protected_properties_on_form_object_sk
end
end
def test_form_with_with_collection_select
post = Post.new
def post.active; false; end
form_with(model: post) do |f|
concat f.collection_select(:active, [true, false], :to_s, :to_s)
end
expected = whole_form("/posts") do
"<select name='post[active]' id='post_active'>" \
"<option value='true'>true</option>\n" \
"<option selected='selected' value='false'>false</option>" \
"</select>"
end
assert_dom_equal expected, output_buffer
end
def test_form_with_with_collection_radio_buttons
post = Post.new
def post.active; false; end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册