Class: JsonApiServer::AttributesBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/json_api_server/attributes_builder.rb

Overview

Related to sparse fieldsets. http://jsonapi.org/format/#fetching-sparse-fieldsets "A client MAY request that an endpoint return only specific fields in the response on a per-type basis by including a fields parameter."

Use this class to build the attributes section in JSON API serializers. It will only add attributes defined in #fields (sparse fieldset). If #fields is nil (no requested sparse fieldset), it will add all attributes.

Examples

This: /articles?include=author&fields=title,body,phone&fields=name

converts to:

{'articles' => ['title', 'body', 'phone'], 'people' => ['name']}

When fields is an array, only fields in the array are added:

AttributesBuilder.new(['title', 'body', 'phone']) .add('title', @record.title) .add('body', @record.body) .add_if('phone', @record.phone, -> { admin? }) # conditionally adding .add('isbn', @record.isbn) # not in sparse fields array .attributes

# when non-admin
# => {
#      'title' => 'Everyone Poops',
#      'body' => 'Taro Gomi'
#   }

#    or...

# when admin
# => {
#      'title' => 'Everyone Poops',
#       'body' => 'Taro Gomi',
#       'phone' => '123-4567',
#   }

When fields is nil, all attributes are added.

AttributesBuilder.new
.add_multi(@record, 'title', 'body')
.add_if('phone', @record.phone, -> { admin? })  # conditionally adding
.add('isbn', @record.isbn)
.attributes

# when non-admin
# => {
#      'title' => 'Everyone Poops',
#      'body' => 'Taro Gomi',
#      'isbn' => '5555555'
#    }

#    or...

# when admin
# => {
#       'title' => 'Everyone Poops',
#       'body' => 'Taro Gomi',
#       'phone' => '123-4567',
#       'isbn' => '5555555'
#    }

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fields = nil) ⇒ AttributesBuilder

  • fields - Array of fields to display for a type. Defaults to nil. When nil, all fields are permitted.


72
73
74
75
76
# File 'lib/json_api_server/attributes_builder.rb', line 72

def initialize(fields = nil)
  @hash = {}
  @fields = fields
  @fields.map!(&:to_s) if @fields.respond_to?(:map)
end

Instance Attribute Details

#fieldsObject (readonly)

(Array or nil) fields (sparse fieldset) array passed in initialize.



69
70
71
# File 'lib/json_api_server/attributes_builder.rb', line 69

def fields
  @fields
end

Instance Method Details

#add(name, value) ⇒ Object

Adds attribute if attribute name is in fields array.

i.e,

JsonApiServer::AttributesBuilder.new(fields) .add('name', @object.name) .attributes



85
86
87
88
# File 'lib/json_api_server/attributes_builder.rb', line 85

def add(name, value)
  @hash[name.to_s] = value if add_attr?(name)
  self
end

#add_if(name, value, proc) ⇒ Object

Adds attribute if attribute name is in fields array and proc returns true.

i.e,

JsonApiServer::AttributesBuilder.new(fields) .add_if('email', @object.email, -> { admin? }) .attributes



109
110
111
112
# File 'lib/json_api_server/attributes_builder.rb', line 109

def add_if(name, value, proc)
  @hash[name] = value if add_attr?(name) && proc.call == true
  self
end

#add_multi(object, *attrs) ⇒ Object

Add multiple attributes.

i.e,

JsonApiServer::AttributesBuilder.new(fields) .add_multi(@object, 'name', 'email', 'logins') .attributes



97
98
99
100
# File 'lib/json_api_server/attributes_builder.rb', line 97

def add_multi(object, *attrs)
  attrs.each { |attr| add(attr, object.send(attr)) }
  self
end

#attributesObject

Returns attributes as a hash.

i.e., { 'title' => 'Everyone Poops', 'body' => 'Taro Gomi', 'phone' => '123-4567', 'isbn' => '5555555' }



123
124
125
# File 'lib/json_api_server/attributes_builder.rb', line 123

def attributes
  @hash
end