Change form_with to generates ids by default

When `form_with` was introduced we disabled the automatic
generation of ids that was enabled in `form_for`. This usually
is not an good idea since labels don't work when the input
doesn't have an id and it made harder to test with Capybara.

You can still disable the automatic generation of ids setting
`config.action_view.form_with_generates_ids` to `false.`
This commit is contained in:
npezza93 2017-06-13 10:54:35 -04:00 committed by Rafael Mendonça França
parent f76ca450f5
commit 260d6f112a
No known key found for this signature in database
GPG Key ID: FC23B6D0F1EEE948
12 changed files with 311 additions and 226 deletions

@ -1,3 +1,14 @@
* Change `form_with` to generates ids by default.
When `form_with` was introduced we disabled the automatic generation of ids
that was enabled in `form_for`. This usually is not an good idea since labels don't work
when the input doesn't have an id and it made harder to test with Capybara.
You can still disable the automatic generation of ids setting `config.action_view.form_with_generates_ids`
to `false.`
*Nick Pezza*
* Fix issues with `field_error_proc` wrapping `optgroup` and select divider `option`.
Fixes #31088

@ -478,6 +478,8 @@ def apply_form_for_options!(record, object, options) #:nodoc:
mattr_accessor :form_with_generates_remote_forms, default: true
mattr_accessor :form_with_generates_ids, default: true
# Creates a form tag based on mixing URLs, scopes, or models.
#
# # Using just a URL:
@ -640,16 +642,6 @@ def apply_form_for_options!(record, object, options) #:nodoc:
#
# Where <tt>@document = Document.find(params[:id])</tt>.
#
# When using labels +form_with+ requires setting the id on the field being
# labelled:
#
# <%= form_with(model: @post) do |form| %>
# <%= form.label :title %>
# <%= form.text_field :title, id: :post_title %>
# <% end %>
#
# See +label+ for more on how the +for+ attribute is derived.
#
# === Mixing with other form helpers
#
# While +form_with+ uses a FormBuilder object it's possible to mix and
@ -746,7 +738,6 @@ def apply_form_for_options!(record, object, options) #:nodoc:
# end
def form_with(model: nil, scope: nil, url: nil, format: nil, **options)
options[:allow_method_names_outside_object] = true
options[:skip_default_ids] = true
if model
url ||= polymorphic_path(model, format: format)
@ -1044,16 +1035,6 @@ def fields_for(record_name, record_object = nil, options = {}, &block)
# or model is yielded, so any generated field names are prefixed with
# either the passed scope or the scope inferred from the <tt>:model</tt>.
#
# When using labels +fields+ requires setting the id on the field being
# labelled:
#
# <%= fields :comment do |fields| %>
# <%= fields.label :body %>
# <%= fields.text_field :body, id: :comment_body %>
# <% end %>
#
# See +label+ for more on how the +for+ attribute is derived.
#
# === Mixing with other form helpers
#
# While +form_with+ uses a FormBuilder object it's possible to mix and
@ -1072,7 +1053,6 @@ def fields_for(record_name, record_object = nil, options = {}, &block)
# FormOptionsHelper#collection_select and DateHelper#datetime_select.
def fields(scope = nil, model: nil, **options, &block)
options[:allow_method_names_outside_object] = true
options[:skip_default_ids] = true
if model
scope ||= model_name_from_record_or_class(model).param_key
@ -1676,7 +1656,7 @@ def to_model
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_options = @options ? @options.slice(:index, :namespace, :allow_method_names_outside_object) : {}
convert_to_legacy_options(@options)
@ -1985,7 +1965,6 @@ def fields_for(record_name, record_object = nil, fields_options = {}, &block)
# See the docs for the <tt>ActionView::FormHelper.fields</tt> helper method.
def fields(scope = nil, model: nil, **options, &block)
options[:allow_method_names_outside_object] = true
options[:skip_default_ids] = true
convert_to_legacy_options(options)

@ -15,7 +15,6 @@ def initialize(object_name, method_name, template_object, options = {})
@object_name.sub!(/\[\]$/, "") || @object_name.sub!(/\[\]\]$/, "]")
@object = retrieve_object(options.delete(:object))
@skip_default_ids = options.delete(:skip_default_ids)
@allow_method_names_outside_object = options.delete(:allow_method_names_outside_object)
@options = options
@ -97,7 +96,7 @@ def add_default_name_and_id(options)
index = name_and_id_index(options)
options["name"] = options.fetch("name") { tag_name(options["multiple"], index) }
unless skip_default_ids?
if generate_ids?
options["id"] = options.fetch("id") { tag_id(index) }
if namespace = options.delete("namespace")
options["id"] = options["id"] ? "#{namespace}_#{options['id']}" : namespace
@ -183,8 +182,8 @@ def name_and_id_index(options)
end
end
def skip_default_ids?
@skip_default_ids
def generate_ids?
ActionView::Helpers::FormHelper.form_with_generates_ids
end
end
end

@ -12,7 +12,6 @@ class CheckBoxBuilder < Builder # :nodoc:
def check_box(extra_html_options = {})
html_options = extra_html_options.merge(@input_html_options)
html_options[:multiple] = true
html_options[:skip_default_ids] = false
@template_object.check_box(@object_name, @method_name, html_options, @value, nil)
end
end

@ -11,7 +11,6 @@ class CollectionRadioButtons < Base # :nodoc:
class RadioButtonBuilder < Builder # :nodoc:
def radio_button(extra_html_options = {})
html_options = extra_html_options.merge(@input_html_options)
html_options[:skip_default_ids] = false
@template_object.radio_button(@object_name, @method_name, @value, html_options)
end
end

@ -75,10 +75,6 @@ def render(&block)
def render_component(builder)
builder.translation
end
def skip_default_ids?
false # The id is used as the `for` attribute.
end
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.except(:allow_method_names_outside_object)
super(object_name, method_name, template_object, options)
end

@ -28,6 +28,15 @@ class Railtie < Rails::Engine # :nodoc:
end
end
initializer "action_view.form_with_generates_ids" do |app|
ActiveSupport.on_load(:action_view) do
form_with_generates_ids = app.config.action_view.delete(:form_with_generates_ids)
unless form_with_generates_ids.nil?
ActionView::Helpers::FormHelper.form_with_generates_ids = form_with_generates_ids
end
end
end
initializer "action_view.logger" do
ActiveSupport.on_load(:action_view) { self.logger ||= Rails.logger }
end

@ -314,11 +314,11 @@ def test_form_with
expected = whole_form("/posts/123", "create-post", method: "patch") do
"<label for='post_title'>The Title</label>" \
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />" \
"<select name='post[category]'><option value='animal'>animal</option>\n<option value='economy'>economy</option>\n<option value='sports'>sports</option></select>" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />" \
"<select name='post[category]' id='post_category'><option value='animal'>animal</option>\n<option value='economy'>economy</option>\n<option value='sports'>sports</option></select>" \
"<input name='commit' data-disable-with='Create post' type='submit' value='Create post' />" \
"<button name='button' type='submit'>Create post</button>" \
"<button name='button' type='submit'><span>Create post</span></button>"
@ -327,6 +327,34 @@ def test_form_with
assert_dom_equal expected, output_buffer
end
def test_form_with_not_outputting_ids
old_value = ActionView::Helpers::FormHelper.form_with_generates_ids
ActionView::Helpers::FormHelper.form_with_generates_ids = false
form_with(model: @post, id: "create-post") do |f|
concat f.label(:title) { "The Title" }
concat f.text_field(:title)
concat f.text_area(:body)
concat f.check_box(:secret)
concat f.select(:category, %w( animal economy sports ))
concat f.submit("Create post")
end
expected = whole_form("/posts/123", "create-post", method: "patch") do
"<label>The Title</label>" \
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />" \
"<select name='post[category]'><option value='animal'>animal</option>\n<option value='economy'>economy</option>\n<option value='sports'>sports</option></select>" \
"<input name='commit' data-disable-with='Create post' type='submit' value='Create post' />"
end
assert_dom_equal expected, output_buffer
ensure
ActionView::Helpers::FormHelper.form_with_generates_ids = old_value
end
def test_form_with_only_url_on_create
form_with(url: "/posts") do |f|
concat f.label :title, "Label me"
@ -335,7 +363,7 @@ def test_form_with_only_url_on_create
expected = whole_form("/posts") do
'<label for="title">Label me</label>' \
'<input type="text" name="title">'
'<input type="text" name="title" id="title">'
end
assert_dom_equal expected, output_buffer
@ -349,7 +377,7 @@ def test_form_with_only_url_on_update
expected = whole_form("/posts/123") do
'<label for="title">Label me</label>' \
'<input type="text" name="title">'
'<input type="text" name="title" id="title">'
end
assert_dom_equal expected, output_buffer
@ -361,7 +389,7 @@ def test_form_with_general_attributes
end
expected = whole_form("/posts/123") do
'<input type="text" name="no_model_to_back_this_badboy">'
'<input type="text" name="no_model_to_back_this_badboy" id="no_model_to_back_this_badboy" >'
end
assert_dom_equal expected, output_buffer
@ -373,7 +401,7 @@ def test_form_with_attribute_not_on_model
end
expected = whole_form("/posts/123", method: :patch) do
'<input type="text" name="post[this_dont_exist_on_post]">'
'<input type="text" name="post[this_dont_exist_on_post]" id="post_this_dont_exist_on_post" >'
end
assert_dom_equal expected, output_buffer
@ -391,8 +419,8 @@ def test_form_with_doesnt_call_private_or_protected_properties_on_form_object_sk
end.new
form_with(model: obj, scope: "other_name", url: "/", id: "edit-other-name") do |f|
assert_dom_equal '<input type="hidden" name="other_name[private_property]">', f.hidden_field(:private_property)
assert_dom_equal '<input type="hidden" name="other_name[protected_property]">', f.hidden_field(:protected_property)
assert_dom_equal '<input type="hidden" name="other_name[private_property]" id="other_name_private_property">', f.hidden_field(:private_property)
assert_dom_equal '<input type="hidden" name="other_name[protected_property]" id="other_name_protected_property">', f.hidden_field(:protected_property)
end
end
@ -459,7 +487,7 @@ def post.id; 1; end
"<label for='post_active_false'>" \
"<input checked='checked' name='post[active]' type='radio' value='false' id='post_active_false' />" \
"false</label>" \
"<input name='post[id]' type='hidden' value='1' />"
"<input name='post[id]' type='hidden' value='1' id='post_id' />"
end
assert_dom_equal expected, output_buffer
@ -557,7 +585,7 @@ def post.id; 1; end
"<label for='post_tag_ids_3'>" \
"<input checked='checked' name='post[tag_ids][]' type='checkbox' value='3' id='post_tag_ids_3' />" \
"Tag 3</label>" \
"<input name='post[id]' type='hidden' value='1' />"
"<input name='post[id]' type='hidden' value='1' id='post_id' />"
end
assert_dom_equal expected, output_buffer
@ -587,7 +615,7 @@ def test_form_with_with_file_field_generate_multipart
end
expected = whole_form("/posts/123", "create-post", method: "patch", multipart: true) do
"<input name='post[file]' type='file' />"
"<input name='post[file]' type='file' id='post_file' />"
end
assert_dom_equal expected, output_buffer
@ -601,7 +629,7 @@ def test_fields_with_file_field_generate_multipart
end
expected = whole_form("/posts/123", method: "patch", multipart: true) do
"<input name='post[comment][file]' type='file' />"
"<input name='post[comment][file]' type='file' id='post_comment_file'/>"
end
assert_dom_equal expected, output_buffer
@ -640,7 +668,7 @@ def test_form_with_with_model_using_relative_model_naming
end
expected = whole_form("/posts/44", method: "patch") do
"<input name='post[title]' type='text' value='And his name will be forty and four.' />" \
"<input name='post[title]' type='text' value='And his name will be forty and four.' id='post_title' />" \
"<input name='commit' data-disable-with='Edit post' type='submit' value='Edit post' />"
end
@ -658,10 +686,10 @@ def test_form_with_with_symbol_scope
expected = whole_form("/posts/123", "create-post", method: "patch") do
"<label for='other_name_title' class='post_title'>Title</label>" \
"<input name='other_name[title]' value='Hello World' type='text' />" \
"<textarea name='other_name[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='other_name[title]' value='Hello World' type='text' id='other_name_title' />" \
"<textarea name='other_name[body]' id='other_name_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='other_name[secret]' value='0' type='hidden' />" \
"<input name='other_name[secret]' checked='checked' value='1' type='checkbox' />" \
"<input name='other_name[secret]' checked='checked' value='1' type='checkbox' id='other_name_secret' />" \
"<input name='commit' value='Create post' data-disable-with='Create post' type='submit' />"
end
@ -676,10 +704,10 @@ def test_form_with_with_method_as_part_of_html_options
end
expected = whole_form("/", "create-post", method: "delete") do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret'/>"
end
assert_dom_equal expected, output_buffer
@ -693,10 +721,10 @@ def test_form_with_with_method
end
expected = whole_form("/", "create-post", method: "delete") do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body' >\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
end
assert_dom_equal expected, output_buffer
@ -710,7 +738,7 @@ def test_form_with_with_search_field
end
expected = whole_form("/search", "search-post", method: "get") do
"<input name='post[title]' type='search' />"
"<input name='post[title]' type='search' id='post_title' />"
end
assert_dom_equal expected, output_buffer
@ -724,10 +752,10 @@ def test_form_with_enables_remote_by_default
end
expected = whole_form("/", "create-post", method: "patch") do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body' >\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
end
assert_dom_equal expected, output_buffer
@ -744,10 +772,10 @@ def test_form_is_not_remote_by_default_if_form_with_generates_remote_forms_is_fa
end
expected = whole_form("/", "create-post", method: "patch", local: true) do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
end
assert_dom_equal expected, output_buffer
@ -761,7 +789,7 @@ def test_form_with_skip_enforcing_utf8_true
end
expected = whole_form("/", skip_enforcing_utf8: true) do
"<input name='post[title]' type='text' value='Hello World' />"
"<input name='post[title]' type='text' value='Hello World' id='post_title' />"
end
assert_dom_equal expected, output_buffer
@ -773,7 +801,7 @@ def test_form_with_skip_enforcing_utf8_false
end
expected = whole_form("/", skip_enforcing_utf8: false) do
"<input name='post[title]' type='text' value='Hello World' />"
"<input name='post[title]' type='text' value='Hello World' id='post_title' />"
end
assert_dom_equal expected, output_buffer
@ -787,10 +815,10 @@ def test_form_with_without_object
end
expected = whole_form("/", "create-post") do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body' >\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
end
assert_dom_equal expected, output_buffer
@ -806,10 +834,10 @@ def test_form_with_with_index
expected = whole_form("/posts/123", method: "patch") do
"<label for='post_123_title'>Title</label>" \
"<input name='post[123][title]' type='text' value='Hello World' />" \
"<textarea name='post[123][body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[123][title]' type='text' value='Hello World' id='post_123_title' />" \
"<textarea name='post[123][body]' id='post_123_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[123][secret]' type='hidden' value='0' />" \
"<input name='post[123][secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[123][secret]' checked='checked' type='checkbox' value='1' id='post_123_secret' />"
end
assert_dom_equal expected, output_buffer
@ -823,10 +851,10 @@ def test_form_with_with_nil_index_option_override
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[][title]' type='text' value='Hello World' />" \
"<textarea name='post[][body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[][title]' type='text' value='Hello World' id='post__title' />" \
"<textarea name='post[][body]' id='post__body' >\nBack to the hill and over it again!</textarea>" \
"<input name='post[][secret]' type='hidden' value='0' />" \
"<input name='post[][secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[][secret]' checked='checked' type='checkbox' value='1' id='post__secret' />"
end
assert_dom_equal expected, output_buffer
@ -841,7 +869,7 @@ def test_form_with_label_error_wrapping
expected = whole_form("/posts/123", method: "patch") do
"<div class='field_with_errors'><label for='post_author_name' class='label'>Author name</label></div>" \
"<div class='field_with_errors'><input name='post[author_name]' type='text' value='' /></div>" \
"<div class='field_with_errors'><input name='post[author_name]' type='text' value='' id='post_author_name' /></div>" \
"<input name='commit' data-disable-with='Create post' type='submit' value='Create post' />"
end
@ -859,7 +887,7 @@ def test_form_with_label_error_wrapping_without_conventional_instance_variable
expected = whole_form("/posts/123", method: "patch") do
"<div class='field_with_errors'><label for='post_author_name' class='label'>Author name</label></div>" \
"<div class='field_with_errors'><input name='post[author_name]' type='text' value='' /></div>" \
"<div class='field_with_errors'><input name='post[author_name]' type='text' value='' id='post_author_name' /></div>" \
"<input name='commit' data-disable-with='Create post' type='submit' value='Create post' />"
end
@ -947,7 +975,7 @@ def test_fields_with_attributes_not_on_model
end
expected = whole_form("/posts/123", method: :patch) do
'<input type="text" name="post[comment][dont_exist_on_model]">'
'<input type="text" name="post[comment][dont_exist_on_model]" id="post_comment_dont_exist_on_model" >'
end
assert_dom_equal expected, output_buffer
@ -967,7 +995,7 @@ def test_fields_with_attributes_not_on_model_deep_nested
end
expected = whole_form do
'<input name="posts[post][0][comment][1][dont_exist_on_model]" type="text">'
'<input name="posts[post][0][comment][1][dont_exist_on_model]" type="text" id="posts_post_0_comment_1_dont_exist_on_model" >'
end
assert_dom_equal expected, output_buffer
@ -982,7 +1010,7 @@ def test_nested_fields
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[comment][body]' type='text' value='Hello World' />"
"<input name='post[comment][body]' type='text' value='Hello World' id='post_comment_body' />"
end
assert_dom_equal expected, output_buffer
@ -1002,7 +1030,7 @@ def test_deep_nested_fields
end
expected = whole_form do
"<input name='posts[post][0][comment][1][name]' type='text' value='comment #1' />"
"<input name='posts[post][0][comment][1][name]' type='text' value='comment #1' id='posts_post_0_comment_1_name' />"
end
assert_dom_equal expected, output_buffer
@ -1017,8 +1045,8 @@ def test_nested_fields_with_nested_collections
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[123][title]' type='text' value='Hello World' />" \
"<input name='post[123][comment][][name]' type='text' value='new comment' />"
"<input name='post[123][title]' type='text' value='Hello World' id='post_123_title' />" \
"<input name='post[123][comment][][name]' type='text' value='new comment' id='post_123_comment__name' />"
end
assert_dom_equal expected, output_buffer
@ -1033,8 +1061,8 @@ def test_nested_fields_with_index_and_parent_fields
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[1][title]' type='text' value='Hello World' />" \
"<input name='post[1][comment][1][name]' type='text' value='new comment' />"
"<input name='post[1][title]' type='text' value='Hello World' id='post_1_title' />" \
"<input name='post[1][comment][1][name]' type='text' value='new comment' id='post_1_comment_1_name' />"
end
assert_dom_equal expected, output_buffer
@ -1048,7 +1076,7 @@ def test_form_with_with_index_and_nested_fields
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[1][comment][title]' type='text' value='Hello World' />"
"<input name='post[1][comment][title]' type='text' value='Hello World' id='post_1_comment_title' />"
end
assert_dom_equal expected, output_buffer
@ -1062,7 +1090,7 @@ def test_nested_fields_with_index_on_both
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[1][comment][5][title]' type='text' value='Hello World' />"
"<input name='post[1][comment][5][title]' type='text' value='Hello World' id='post_1_comment_5_title' />"
end
assert_dom_equal expected, output_buffer
@ -1076,7 +1104,7 @@ def test_nested_fields_with_auto_index
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[123][comment][title]' type='text' value='Hello World' />"
"<input name='post[123][comment][title]' type='text' value='Hello World' id='post_123_comment_title' />"
end
assert_dom_equal expected, output_buffer
@ -1090,7 +1118,7 @@ def test_nested_fields_with_index_radio_button
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[comment][5][title]' type='radio' value='hello' />"
"<input name='post[comment][5][title]' type='radio' value='hello' id='post_comment_5_title_hello' />"
end
assert_dom_equal expected, output_buffer
@ -1104,7 +1132,7 @@ def test_nested_fields_with_auto_index_on_both
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[123][comment][123][title]' type='text' value='Hello World' />"
"<input name='post[123][comment][123][title]' type='text' value='Hello World' id='post_123_comment_123_title' />"
end
assert_dom_equal expected, output_buffer
@ -1124,9 +1152,9 @@ def test_nested_fields_with_index_and_auto_index
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[123][comment][5][title]' type='text' value='Hello World' />"
"<input name='post[123][comment][5][title]' type='text' value='Hello World' id='post_123_comment_5_title' />"
end + whole_form("/posts/123", method: "patch") do
"<input name='post[1][comment][123][title]' type='text' value='Hello World' />"
"<input name='post[1][comment][123][title]' type='text' value='Hello World' id='post_1_comment_123_title' />"
end
assert_dom_equal expected, output_buffer
@ -1143,8 +1171,8 @@ def test_nested_fields_with_a_new_record_on_a_nested_attributes_one_to_one_assoc
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="new author" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="new author" id="post_author_attributes_name" />'
end
assert_dom_equal expected, output_buffer
@ -1170,9 +1198,9 @@ def test_nested_fields_with_an_existing_record_on_a_nested_attributes_one_to_one
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" id="post_author_attributes_id" />'
end
assert_dom_equal expected, output_buffer
@ -1189,9 +1217,9 @@ def test_nested_fields_with_an_existing_record_on_a_nested_attributes_one_to_one
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" id="post_author_attributes_id" />'
end
assert_dom_equal expected, output_buffer
@ -1208,8 +1236,8 @@ def test_nested_fields_with_an_existing_record_on_a_nested_attributes_one_to_one
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />'
end
assert_dom_equal expected, output_buffer
@ -1226,8 +1254,8 @@ def test_nested_fields_with_an_existing_record_on_a_nested_attributes_one_to_one
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />'
end
assert_dom_equal expected, output_buffer
@ -1244,9 +1272,9 @@ def test_nested_fields_with_an_existing_record_on_a_nested_attributes_one_to_one
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" id="post_author_attributes_id" />'
end
assert_dom_equal expected, output_buffer
@ -1264,9 +1292,9 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_one_to_one_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" id="post_author_attributes_id" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />'
end
assert_dom_equal expected, output_buffer
@ -1285,11 +1313,11 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_collection_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" id="post_comments_attributes_1_id" />'
end
assert_dom_equal expected, output_buffer
@ -1312,11 +1340,11 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_collection_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" id="post_author_attributes_id" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1339,10 +1367,10 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_collection_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1365,11 +1393,11 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_collection_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[author_attributes][name]" type="text" value="author #321" id="post_author_attributes_name" />' \
'<input name="post[author_attributes][id]" type="hidden" value="321" id="post_author_attributes_id" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1388,11 +1416,11 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_collection_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" id="post_comments_attributes_1_id" />'
end
assert_dom_equal expected, output_buffer
@ -1412,11 +1440,11 @@ def test_nested_fields_with_existing_records_on_a_nested_attributes_collection_a
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" id="post_comments_attributes_1_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1435,9 +1463,9 @@ def test_nested_fields_with_new_records_on_a_nested_attributes_collection_associ
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="new comment" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="new comment" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="new comment" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="new comment" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1456,10 +1484,10 @@ def test_nested_fields_with_existing_and_new_records_on_a_nested_attributes_coll
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #321" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="321" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="new comment" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #321" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="321" id="post_comments_attributes_0_id"/>' \
'<input name="post[comments_attributes][1][name]" type="text" value="new comment" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1474,7 +1502,7 @@ def test_nested_fields_with_an_empty_supplied_attributes_collection
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />'
end
assert_dom_equal expected, output_buffer
@ -1491,11 +1519,11 @@ def test_nested_fields_with_existing_records_on_a_supplied_nested_attributes_col
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" id="post_comments_attributes_1_id" />'
end
assert_dom_equal expected, output_buffer
@ -1512,11 +1540,11 @@ def test_nested_fields_arel_like
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" id="post_comments_attributes_1_id" />'
end
assert_dom_equal expected, output_buffer
@ -1547,11 +1575,11 @@ def test_nested_fields_with_existing_records_on_a_supplied_nested_attributes_col
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #1" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="1" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="comment #2" id="post_comments_attributes_1_name" />' \
'<input name="post[comments_attributes][1][id]" type="hidden" value="2" id="post_comments_attributes_1_id" />'
end
assert_dom_equal expected, output_buffer
@ -1570,10 +1598,10 @@ def test_nested_fields_on_a_nested_attributes_collection_association_yields_only
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[title]" type="text" value="Hello World" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #321" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="321" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="new comment" />'
'<input name="post[title]" type="text" value="Hello World" id="post_title" />' \
'<input name="post[comments_attributes][0][name]" type="text" value="comment #321" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="321" id="post_comments_attributes_0_id" />' \
'<input name="post[comments_attributes][1][name]" type="text" value="new comment" id="post_comments_attributes_1_name" />'
end
assert_dom_equal expected, output_buffer
@ -1590,8 +1618,8 @@ def test_nested_fields_with_child_index_option_override_on_a_nested_attributes_c
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[comments_attributes][abc][name]" type="text" value="comment #321" />' \
'<input name="post[comments_attributes][abc][id]" type="hidden" value="321" />'
'<input name="post[comments_attributes][abc][name]" type="text" value="comment #321" id="post_comments_attributes_abc_name" />' \
'<input name="post[comments_attributes][abc][id]" type="hidden" value="321" id="post_comments_attributes_abc_id" />'
end
assert_dom_equal expected, output_buffer
@ -1607,8 +1635,8 @@ def test_nested_fields_with_child_index_as_lambda_option_override_on_a_nested_at
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[comments_attributes][abc][name]" type="text" value="comment #321" />' \
'<input name="post[comments_attributes][abc][id]" type="hidden" value="321" />'
'<input name="post[comments_attributes][abc][name]" type="text" value="comment #321" id="post_comments_attributes_abc_name" />' \
'<input name="post[comments_attributes][abc][id]" type="hidden" value="321" id="post_comments_attributes_abc_id" />'
end
assert_dom_equal expected, output_buffer
@ -1630,8 +1658,8 @@ def test_nested_fields_with_child_index_option_override_on_a_nested_attributes_c
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[comments_attributes][abc][name]" type="text" value="comment #321" />' \
'<input name="post[comments_attributes][abc][id]" type="hidden" value="321" />'
'<input name="post[comments_attributes][abc][name]" type="text" value="comment #321" id="post_comments_attributes_abc_name" />' \
'<input name="post[comments_attributes][abc][id]" type="hidden" value="321" id="post_comments_attributes_abc_id" />'
end
assert_dom_equal expected, output_buffer
@ -1716,18 +1744,18 @@ def test_nested_fields_uses_unique_indices_for_different_collection_associations
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[comments_attributes][0][name]" type="text" value="comment #321" />' \
'<input name="post[comments_attributes][0][relevances_attributes][0][value]" type="text" value="commentrelevance #314" />' \
'<input name="post[comments_attributes][0][relevances_attributes][0][id]" type="hidden" value="314" />' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="321" />' \
'<input name="post[tags_attributes][0][value]" type="text" value="tag #123" />' \
'<input name="post[tags_attributes][0][relevances_attributes][0][value]" type="text" value="tagrelevance #3141" />' \
'<input name="post[tags_attributes][0][relevances_attributes][0][id]" type="hidden" value="3141" />' \
'<input name="post[tags_attributes][0][id]" type="hidden" value="123" />' \
'<input name="post[tags_attributes][1][value]" type="text" value="tag #456" />' \
'<input name="post[tags_attributes][1][relevances_attributes][0][value]" type="text" value="tagrelevance #31415" />' \
'<input name="post[tags_attributes][1][relevances_attributes][0][id]" type="hidden" value="31415" />' \
'<input name="post[tags_attributes][1][id]" type="hidden" value="456" />'
'<input name="post[comments_attributes][0][name]" type="text" value="comment #321" id="post_comments_attributes_0_name" />' \
'<input name="post[comments_attributes][0][relevances_attributes][0][value]" type="text" value="commentrelevance #314" id="post_comments_attributes_0_relevances_attributes_0_value" />' \
'<input name="post[comments_attributes][0][relevances_attributes][0][id]" type="hidden" value="314" id="post_comments_attributes_0_relevances_attributes_0_id"/>' \
'<input name="post[comments_attributes][0][id]" type="hidden" value="321" id="post_comments_attributes_0_id"/>' \
'<input name="post[tags_attributes][0][value]" type="text" value="tag #123" id="post_tags_attributes_0_value"/>' \
'<input name="post[tags_attributes][0][relevances_attributes][0][value]" type="text" value="tagrelevance #3141" id="post_tags_attributes_0_relevances_attributes_0_value"/>' \
'<input name="post[tags_attributes][0][relevances_attributes][0][id]" type="hidden" value="3141" id="post_tags_attributes_0_relevances_attributes_0_id"/>' \
'<input name="post[tags_attributes][0][id]" type="hidden" value="123" id="post_tags_attributes_0_id"/>' \
'<input name="post[tags_attributes][1][value]" type="text" value="tag #456" id="post_tags_attributes_1_value"/>' \
'<input name="post[tags_attributes][1][relevances_attributes][0][value]" type="text" value="tagrelevance #31415" id="post_tags_attributes_1_relevances_attributes_0_value"/>' \
'<input name="post[tags_attributes][1][relevances_attributes][0][id]" type="hidden" value="31415" id="post_tags_attributes_1_relevances_attributes_0_id"/>' \
'<input name="post[tags_attributes][1][id]" type="hidden" value="456" id="post_tags_attributes_1_id"/>'
end
assert_dom_equal expected, output_buffer
@ -1743,7 +1771,7 @@ def test_nested_fields_with_hash_like_model
end
expected = whole_form("/posts/123", method: "patch") do
'<input name="post[author_attributes][name]" type="text" value="hash backed author" />'
'<input name="post[author_attributes][name]" type="text" value="hash backed author" id="post_author_attributes_name" />'
end
assert_dom_equal expected, output_buffer
@ -1757,10 +1785,10 @@ def test_fields
end
expected =
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
assert_dom_equal expected, output_buffer
end
@ -1773,10 +1801,10 @@ def test_fields_with_index
end
expected =
"<input name='post[123][title]' type='text' value='Hello World' />" \
"<textarea name='post[123][body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[123][title]' type='text' value='Hello World' id='post_123_title' />" \
"<textarea name='post[123][body]' id='post_123_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[123][secret]' type='hidden' value='0' />" \
"<input name='post[123][secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[123][secret]' checked='checked' type='checkbox' value='1' id='post_123_secret' />"
assert_dom_equal expected, output_buffer
end
@ -1789,10 +1817,10 @@ def test_fields_with_nil_index_option_override
end
expected =
"<input name='post[][title]' type='text' value='Hello World' />" \
"<textarea name='post[][body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[][title]' type='text' value='Hello World' id='post__title' />" \
"<textarea name='post[][body]' id='post__body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[][secret]' type='hidden' value='0' />" \
"<input name='post[][secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[][secret]' checked='checked' type='checkbox' value='1' id='post__secret' />"
assert_dom_equal expected, output_buffer
end
@ -1805,10 +1833,10 @@ def test_fields_with_index_option_override
end
expected =
"<input name='post[abc][title]' type='text' value='Hello World' />" \
"<textarea name='post[abc][body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[abc][title]' type='text' value='Hello World' id='post_abc_title' />" \
"<textarea name='post[abc][body]' id='post_abc_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[abc][secret]' type='hidden' value='0' />" \
"<input name='post[abc][secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[abc][secret]' checked='checked' type='checkbox' value='1' id='post_abc_secret' />"
assert_dom_equal expected, output_buffer
end
@ -1821,10 +1849,10 @@ def test_fields_without_object
end
expected =
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body' >\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
assert_dom_equal expected, output_buffer
end
@ -1837,10 +1865,10 @@ def test_fields_with_only_object
end
expected =
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body' >\nBack to the hill and over it again!</textarea>" \
"<input name='post[secret]' type='hidden' value='0' />" \
"<input name='post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' />"
assert_dom_equal expected, output_buffer
end
@ -1852,7 +1880,7 @@ def test_fields_object_with_bracketed_name
end
assert_dom_equal "<label for=\"author_post_title\">Title</label>" \
"<input name='author[post][title]' type='text' value='Hello World' />",
"<input name='author[post][title]' type='text' value='Hello World' id='author_post_title' id='author_post_1_title' />",
output_buffer
end
@ -1863,7 +1891,7 @@ def test_fields_object_with_bracketed_name_and_index
end
assert_dom_equal "<label for=\"author_post_1_title\">Title</label>" \
"<input name='author[post][1][title]' type='text' value='Hello World' />",
"<input name='author[post][1][title]' type='text' value='Hello World' id='author_post_1_title' />",
output_buffer
end
@ -1882,10 +1910,10 @@ def test_form_with_and_fields
end
expected = whole_form("/posts/123", "create-post", method: "patch") do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body' >\nBack to the hill and over it again!</textarea>" \
"<input name='parent_post[secret]' type='hidden' value='0' />" \
"<input name='parent_post[secret]' checked='checked' type='checkbox' value='1' />"
"<input name='parent_post[secret]' checked='checked' type='checkbox' value='1' id='parent_post_secret' />"
end
assert_dom_equal expected, output_buffer
@ -1902,9 +1930,9 @@ def test_form_with_and_fields_with_object
end
expected = whole_form("/posts/123", "create-post", method: "patch") do
"<input name='post[title]' type='text' value='Hello World' />" \
"<textarea name='post[body]'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[comment][name]' type='text' value='new comment' />"
"<input name='post[title]' type='text' value='Hello World' id='post_title' />" \
"<textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea>" \
"<input name='post[comment][name]' type='text' value='new comment' id='post_comment_name' />"
end
assert_dom_equal expected, output_buffer
@ -1918,7 +1946,7 @@ def test_form_with_and_fields_with_non_nested_association_and_without_object
end
expected = whole_form("/posts/123", method: "patch") do
"<input name='post[category][name]' type='text' />"
"<input name='post[category][name]' type='text' id='post_category_name' />"
end
assert_dom_equal expected, output_buffer
@ -1942,9 +1970,9 @@ def test_form_with_with_labelled_builder
end
expected = whole_form("/posts/123", method: "patch") do
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' /><br/>" \
"<label for='body'>Body:</label> <textarea name='post[body]'>\nBack to the hill and over it again!</textarea><br/>" \
"<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' value='1' /><br/>"
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' id='post_title'/><br/>" \
"<label for='body'>Body:</label> <textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea><br/>" \
"<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' /><br/>"
end
assert_dom_equal expected, output_buffer
@ -1961,9 +1989,9 @@ def test_default_form_builder
end
expected = whole_form("/posts/123", method: "patch") do
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' /><br/>" \
"<label for='body'>Body:</label> <textarea name='post[body]'>\nBack to the hill and over it again!</textarea><br/>" \
"<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' value='1' /><br/>"
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' id='post_title' /><br/>" \
"<label for='body'>Body:</label> <textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea><br/>" \
"<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' /><br/>"
end
assert_dom_equal expected, output_buffer
@ -1980,7 +2008,7 @@ def test_lazy_loading_default_form_builder
end
expected = whole_form("/posts/123", method: "patch") do
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' /><br/>"
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' id='post_title' /><br/>"
end
assert_dom_equal expected, output_buffer
@ -1995,7 +2023,7 @@ def test_form_builder_override
concat f.text_field(:title)
end
expected = "<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' /><br/>"
expected = "<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' id='post_title' /><br/>"
assert_dom_equal expected, output_buffer
end
@ -2007,7 +2035,7 @@ def test_lazy_loading_form_builder_override
concat f.text_field(:title)
end
expected = "<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' /><br/>"
expected = "<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' id='post_title' /><br/>"
assert_dom_equal expected, output_buffer
end
@ -2020,9 +2048,9 @@ def test_fields_with_labelled_builder
end
expected =
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' /><br/>" \
"<label for='body'>Body:</label> <textarea name='post[body]'>\nBack to the hill and over it again!</textarea><br/>" \
"<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' value='1' /><br/>"
"<label for='title'>Title:</label> <input name='post[title]' type='text' value='Hello World' id='post_title'/><br/>" \
"<label for='body'>Body:</label> <textarea name='post[body]' id='post_body'>\nBack to the hill and over it again!</textarea><br/>" \
"<label for='secret'>Secret:</label> <input name='post[secret]' type='hidden' value='0' /><input name='post[secret]' checked='checked' type='checkbox' value='1' id='post_secret' /><br/>"
assert_dom_equal expected, output_buffer
end

@ -578,6 +578,8 @@ Defaults to `'signed cookie'`.
* `config.action_view.form_with_generates_remote_forms` determines whether `form_with` generates remote forms or not. This defaults to `true`.
* `config.action_view.form_with_generates_ids` determines whether `form_with` generates ids on inputs. This defaults to `true`.
### Configuring Action Mailer
There are a number of settings available on `config.action_mailer`:

@ -81,6 +81,7 @@ def load_defaults(target_version)
if respond_to?(:action_view)
action_view.form_with_generates_remote_forms = true
action_view.form_with_generates_ids = true
end
when "5.2"

@ -757,6 +757,68 @@ def index
assert_match(/label/, last_response.body)
end
test "form_with can be configured with form_with_generates_ids" do
app_file "config/initializers/form_builder.rb", <<-RUBY
Rails.configuration.action_view.form_with_generates_ids = false
RUBY
app_file "app/models/post.rb", <<-RUBY
class Post
include ActiveModel::Model
attr_accessor :name
end
RUBY
app_file "app/controllers/posts_controller.rb", <<-RUBY
class PostsController < ApplicationController
def index
render inline: "<%= begin; form_with(model: Post.new) {|f| f.text_field(:name)}; rescue => e; e.to_s; end %>"
end
end
RUBY
add_to_config <<-RUBY
routes.prepend do
resources :posts
end
RUBY
app "development"
get "/posts"
assert_no_match(/id=('|")post_name('|")/, last_response.body)
end
test "form_with outputs ids by default" do
app_file "app/models/post.rb", <<-RUBY
class Post
include ActiveModel::Model
attr_accessor :name
end
RUBY
app_file "app/controllers/posts_controller.rb", <<-RUBY
class PostsController < ApplicationController
def index
render inline: "<%= begin; form_with(model: Post.new) {|f| f.text_field(:name)}; rescue => e; e.to_s; end %>"
end
end
RUBY
add_to_config <<-RUBY
routes.prepend do
resources :posts
end
RUBY
app "development"
get "/posts"
assert_match(/id=('|")post_name('|")/, last_response.body)
end
test "form_with can be configured with form_with_generates_remote_forms" do
app_file "config/initializers/form_builder.rb", <<-RUBY
Rails.configuration.action_view.form_with_generates_remote_forms = false