mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Ensure that 'ActionController::Parameters' can still be passed to AR for collection associations
This commit is contained in:
parent
2a0a264b39
commit
b5d4dd47de
2 changed files with 19 additions and 1 deletions
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue