Sha256: ceebd3f6ebeb3ae8defb6174dc4b777fc39a47f673c80612885305005b604c05
Contents?: true
Size: 1.6 KB
Versions: 1
Compression:
Stored size: 1.6 KB
Contents
module JsonapiCompliable module SerializableHash def to_hash(fields: nil, include: {}) {}.tap do |hash| _fields = fields[jsonapi_type] if fields attrs = requested_attributes(_fields).each_with_object({}) do |(k, v), h| h[k] = instance_eval(&v) end rels = @_relationships.select { |k,v| !!include[k] } rels.each_with_object({}) do |(k, v), h| serializers = v.send(:resources) attrs[k] = if serializers.is_a?(Array) serializers.map do |rr| # use private method to avoid array casting rr.to_hash(fields: fields, include: include[k]) end elsif serializers.nil? nil else serializers.to_hash(fields: fields, include: include[k]) end end hash[:id] = jsonapi_id hash.merge!(attrs) if attrs.any? end end end JSONAPI::Serializable::Resource.send(:include, SerializableHash) class HashRenderer def initialize(resource) @resource = resource end def render(options) serializers = options[:data] opts = options.slice(:fields, :include) to_hash(serializers, opts).tap do |hash| hash.merge!(options.slice(:meta)) if !options[:meta].empty? end end private def to_hash(serializers, opts) {}.tap do |hash| if serializers.is_a?(Array) hash[@resource.type] = serializers.map do |s| s.to_hash(opts) end else hash[@resource.type] = serializers.to_hash(opts) end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
jsonapi_compliable-1.0.alpha.2 | lib/jsonapi_compliable/hash_renderer.rb |