mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Fix nested attributes with specified collection.
This commit is contained in:
@@ -1172,7 +1172,9 @@ module ActionView
|
||||
|
||||
def fields_for_with_nested_attributes(association_name, args, block)
|
||||
name = "#{object_name}[#{association_name}_attributes]"
|
||||
association = args.first.to_model if args.first.respond_to?(:to_model)
|
||||
options = args.extract_options!
|
||||
association = args.shift
|
||||
association = association.to_model if association.respond_to?(:to_model)
|
||||
|
||||
if association.respond_to?(:new_record?)
|
||||
association = [association] if @object.send(association_name).is_a?(Array)
|
||||
@@ -1181,20 +1183,22 @@ module ActionView
|
||||
end
|
||||
|
||||
if association.is_a?(Array)
|
||||
explicit_child_index = args.last[:child_index] if args.last.is_a?(Hash)
|
||||
explicit_child_index = options[:child_index]
|
||||
association.map do |child|
|
||||
fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index(name)}]", child, args, block)
|
||||
fields_for_nested_model("#{name}[#{explicit_child_index || nested_child_index(name)}]", child, options, block)
|
||||
end.join
|
||||
elsif association
|
||||
fields_for_nested_model(name, association, args, block)
|
||||
fields_for_nested_model(name, association, options, block)
|
||||
end
|
||||
end
|
||||
|
||||
def fields_for_nested_model(name, object, args, block)
|
||||
def fields_for_nested_model(name, object, options, block)
|
||||
object = object.to_model if object.respond_to?(:to_model)
|
||||
|
||||
if object.new_record?
|
||||
@template.fields_for(name, object, *args, &block)
|
||||
@template.fields_for(name, object, options, &block)
|
||||
else
|
||||
@template.fields_for(name, object, *args) do |builder|
|
||||
@template.fields_for(name, object, options) do |builder|
|
||||
block.call(builder)
|
||||
@template.concat builder.hidden_field(:id) unless builder.emitted_hidden_id?
|
||||
end
|
||||
|
||||
@@ -918,6 +918,28 @@ class FormHelperTest < ActionView::TestCase
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
def test_nested_fields_for_with_existing_records_on_a_supplied_nested_attributes_collection_different_from_record_one
|
||||
comments = Array.new(2) { |id| Comment.new(id + 1) }
|
||||
@post.comments = []
|
||||
|
||||
form_for(:post, @post) do |f|
|
||||
concat f.text_field(:title)
|
||||
f.fields_for(:comments, comments) do |cf|
|
||||
concat cf.text_field(:name)
|
||||
end
|
||||
end
|
||||
|
||||
expected = '<form action="http://www.example.com" method="post">' +
|
||||
'<input name="post[title]" size="30" type="text" id="post_title" value="Hello World" />' +
|
||||
'<input id="post_comments_attributes_0_name" name="post[comments_attributes][0][name]" size="30" type="text" value="comment #1" />' +
|
||||
'<input id="post_comments_attributes_0_id" name="post[comments_attributes][0][id]" type="hidden" value="1" />' +
|
||||
'<input id="post_comments_attributes_1_name" name="post[comments_attributes][1][name]" size="30" type="text" value="comment #2" />' +
|
||||
'<input id="post_comments_attributes_1_id" name="post[comments_attributes][1][id]" type="hidden" value="2" />' +
|
||||
'</form>'
|
||||
|
||||
assert_dom_equal expected, output_buffer
|
||||
end
|
||||
|
||||
def test_nested_fields_for_on_a_nested_attributes_collection_association_yields_only_builder
|
||||
@post.comments = [Comment.new(321), Comment.new]
|
||||
yielded_comments = []
|
||||
|
||||
Reference in New Issue
Block a user