Skip to content

Her::Model::Attributes.initialize_collection does not accept string keys #396

@ditsara

Description

@ditsara

When I use Faraday::HttpCache in my middleware, cached responses return this error:

/Users/ditsara/.rvm/gems/ruby-2.3.0@gq-commerce/gems/her-0.8.1/lib/her/model/attributes.rb:35

The problem is Faraday::HttpCache returns parsed_data with string keys instead of symbols, so klass.extract_array in her/model/parse.rb:171 returns nil because it's looking for :data (but not 'data').

I was able to work around the problem by adding:

def self.extract_array(request_data)
  super(request_data.with_indifferent_access)
end

to my class (ActiveSupport::HashWithIndifferentAccess). Should extract_array be modified to accept a string key? I can submit a PR if necessary.

relevant code snippets

My middleware:

  c.use Faraday::HttpCache,
    store: Rails.cache,
    shared_cache: false,
    logger: Rails.logger

  # Request
  c.use FaradayMiddleware::EncodeJson

  # Response
  c.use Her::Middleware::DefaultParseJSON

  # Adapter
  c.use Faraday::Adapter::NetHttp

her/model/attributes.rb:34

      def self.initialize_collection(klass, parsed_data={})
        collection_data = klass.extract_array(parsed_data).map do |item_data|
        ...

her/model/parse.rb:171

        def extract_array(request_data)
          if request_data[:data].is_a?(Hash) && (active_model_serializers_format? || json_api_format?)
            request_data[:data][pluralized_parsed_root_element]
          else
            request_data[:data]
          end
        end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions