From b5d4dd47deaae27e8f362bb9636246c5b4c56e5c Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Sat, 18 Jul 2015 08:23:52 -0700 Subject: [PATCH] Ensure that 'ActionController::Parameters' can still be passed to AR for collection associations --- .../lib/active_record/nested_attributes.rb | 6 ++++++ activerecord/test/cases/nested_attributes_test.rb | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/nested_attributes.rb b/activerecord/lib/active_record/nested_attributes.rb index c337e1d18f..a6b76b25bf 100644 --- a/activerecord/lib/active_record/nested_attributes.rb +++ b/activerecord/lib/active_record/nested_attributes.rb @@ -445,6 +445,9 @@ module ActiveRecord # ]) def assign_nested_attributes_for_collection_association(association_name, attributes_collection) options = self.nested_attributes_options[association_name] + if attributes_collection.respond_to?(:permitted?) + attributes_collection = attributes_collection.to_h + end unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array) raise ArgumentError, "Hash or Array expected, got #{attributes_collection.class.name} (#{attributes_collection.inspect})" @@ -471,6 +474,9 @@ module ActiveRecord end attributes_collection.each do |attributes| + if attributes.respond_to?(:permitted?) + attributes = attributes.to_h + end attributes = attributes.with_indifferent_access if attributes['id'].blank? diff --git a/activerecord/test/cases/nested_attributes_test.rb b/activerecord/test/cases/nested_attributes_test.rb index 933dfac806..b8a0401fe3 100644 --- a/activerecord/test/cases/nested_attributes_test.rb +++ b/activerecord/test/cases/nested_attributes_test.rb @@ -1074,12 +1074,16 @@ class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveR true end + def [](key) + @hash[key] + end + def to_h @hash end end - test "strong params style objects can be assigned" do + test "strong params style objects can be assigned for singular associations" do params = { name: "Stern", ship_attributes: ProtectedParameters.new(name: "The Black Rock") } part = ShipPart.new(params) @@ -1087,4 +1091,12 @@ class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveR assert_equal "Stern", part.name assert_equal "The Black Rock", part.ship.name end + + test "strong params style objects can be assigned for collection associations" do + params = { trinkets_attributes: ProtectedParameters.new("0" => ProtectedParameters.new(name: "Necklace"), "1" => ProtectedParameters.new(name: "Spoon")) } + part = ShipPart.new(params) + + assert_equal "Necklace", part.trinkets[0].name + assert_equal "Spoon", part.trinkets[1].name + end end