Sha256: 4afe02492f80bb4b0b7a4b2b76786c299955bdb0ae067c0620d1edac74080704

Contents?: true

Size: 1.54 KB

Versions: 47

Compression:

Stored size: 1.54 KB

Contents

module Para
  module AttributeField
    class NestedOneField < AttributeField::BelongsToField
      include Para::Helpers::AttributesMappings
      include Para::AttributeField::NestedField

      register :nested_one, self

      def parse_input(params, resource)
        if (nested_attributes = params[nested_attributes_key])
          nested_resource = fetch_or_build_nested_resource_for(resource, nested_attributes)
          mappings = nested_model_mappings(nested_attributes, nested_resource)

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

          params[nested_attributes_key] = nested_attributes
        else
          super
        end
      end

      private

      # 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
      #
      def fetch_or_build_nested_resource_for(parent, attributes)
        if (nested_resource = parent.association(name).load_target)
          return nested_resource
        end

        parent.association(name).build(attributes.slice('type')).tap do |resource|
          attributes['id'] = "__#{ object_id }"
          temporarily_extend_new_resource(resource, attributes)
        end
      end
    end
  end
end

Version data entries

47 entries across 47 versions & 1 rubygems

Version Path
para-0.12.4 lib/para/attribute_field/nested_one.rb
para-0.12.3 lib/para/attribute_field/nested_one.rb
para-0.12.2 lib/para/attribute_field/nested_one.rb
para-0.12.1 lib/para/attribute_field/nested_one.rb
para-0.12.0 lib/para/attribute_field/nested_one.rb
para-0.11.4 lib/para/attribute_field/nested_one.rb
para-0.11.3 lib/para/attribute_field/nested_one.rb
para-0.11.2 lib/para/attribute_field/nested_one.rb
para-0.11.1 lib/para/attribute_field/nested_one.rb
para-0.11.0 lib/para/attribute_field/nested_one.rb
para-0.10.0 lib/para/attribute_field/nested_one.rb
para-0.9.4 lib/para/attribute_field/nested_one.rb
para-0.9.3.3 lib/para/attribute_field/nested_one.rb
para-0.9.3.2 lib/para/attribute_field/nested_one.rb
para-0.9.3.1 lib/para/attribute_field/nested_one.rb
para-0.9.2 lib/para/attribute_field/nested_one.rb
para-0.9.0 lib/para/attribute_field/nested_one.rb
para-0.8.15 lib/para/attribute_field/nested_one.rb
para-0.8.14 lib/para/attribute_field/nested_one.rb
para-0.8.13 lib/para/attribute_field/nested_one.rb