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.8.12 lib/para/attribute_field/nested_one.rb
para-0.8.11 lib/para/attribute_field/nested_one.rb
para-0.8.10 lib/para/attribute_field/nested_one.rb
para-0.8.9 lib/para/attribute_field/nested_one.rb
para-0.8.8 lib/para/attribute_field/nested_one.rb
para-0.8.7 lib/para/attribute_field/nested_one.rb
para-0.8.5 lib/para/attribute_field/nested_one.rb
para-0.8.3.3 lib/para/attribute_field/nested_one.rb
para-0.8.3.2 lib/para/attribute_field/nested_one.rb
para-0.8.3.1 lib/para/attribute_field/nested_one.rb
para-0.8.3 lib/para/attribute_field/nested_one.rb
para-0.8.2.3 lib/para/attribute_field/nested_one.rb
para-0.8.2.2 lib/para/attribute_field/nested_one.rb
para-0.8.2.1 lib/para/attribute_field/nested_one.rb
para-0.8.2 lib/para/attribute_field/nested_one.rb
para-0.8.1 lib/para/attribute_field/nested_one.rb
para-0.8.0 lib/para/attribute_field/nested_one.rb
para-0.7.4.p1 lib/para/attribute_field/nested_one.rb
para-0.7.4 lib/para/attribute_field/nested_one.rb
para-0.7.3.p6 lib/para/attribute_field/nested_one.rb