class Para::AttributeField::NestedManyField

Public Instance Methods

parse_input(params, resource) click to toggle source
# File lib/para/attribute_field/nested_many.rb, line 9
def parse_input(params, resource)
  if (nested_attributes = params[nested_attributes_key])
    nested_attributes.each do |index, attributes|
      nested_resource = fetch_or_build_nested_resource_for(resource, index, attributes)
      mappings = nested_model_mappings(attributes, nested_resource)

      mappings.fields.each do |field|
        field.parse_input(attributes, nested_resource)
      end

      params[nested_attributes_key][index] = attributes
    end
  else
    super
  end
end

Private Instance Methods

fetch_or_build_nested_resource_for(parent, index, attributes) click to toggle source

Force loading association and look for a resource matching the provided attributes. If no resource is found, one is created and a fake ‘id` is assigned to it to hack Rails’ nested resources lookup from new attributes params.

This is necessary to be able to provide a resource to the parse_input method when called on the nested resources hash

# File lib/para/attribute_field/nested_many.rb, line 36
def fetch_or_build_nested_resource_for(parent, index, attributes)
  nested_resources = parent.association(name).load_target

  if (id = attributes['id'].presence)
    nested_resources.find { |res| res.id == id.to_i }
  else
    parent.association(name).build(attributes.slice('type')).tap do |resource|
      attributes['id'] = "__#{ index }"
      temporarily_extend_new_resource(resource, attributes)
    end
  end
end