Class: JsonApiServer::ResourceSerializer
- Inherits:
-
BaseSerializer
- Object
- BaseSerializer
- JsonApiServer::ResourceSerializer
- Defined in:
- lib/json_api_server/resource_serializer.rb
Overview
Description
Serializer class for a resource. Subclasses JsonApiServer::BaseSerializer.
Example class:
class CommentSerializer < JsonApiServer::ResourceSerializer
resource_type 'comments'
def links
{ self: File.join(base_url, "/comments/#{@object.id}") }
end
def data
{}.tap do |h|
h['type'] = self.class.type
h['id'] = @object.id
h['attributes'] = attributes
h['relationships'] = inclusions.relationships if inclusions?
end
end
def included
inclusions.included if inclusions?
end
protected
def attributes
attributes_builder
.add_multi(@object, 'title', 'comment')
.add('created_at', @object.created_at.try(:iso8601, 9))
.add('updated_at', @object.updated_at.try(:iso8601, 9))
.attributes
end
def inclusions
@inclusions ||= begin
if relationship?('comment.author')
relationships_builder.relate('author', user_serializer(@object.))
end
if relationship?('comment.author.links')
relationships_builder.include('author', user_serializer(@object.),
relate: { include: [:links] })
end
relationships_builder
end
end
def user_serializer(user, = { include: [:data] })
::UserSerializer.new(
user,
includes: includes,
fields: fields,
as_json_options:
)
end
end
Create an instance from builder:
builder = JsonApiServer::Builder.new(request, Comment.find(params[:id]))
.add_include(['comment.author', 'comment.author.links'])
.add_fields
serializer = CommentSerializer.from_builder(builder)
Direct Known Subclasses
Instance Attribute Summary collapse
-
#fields ⇒ Object
readonly
Hash.
-
#includes ⇒ Object
readonly
Array.
Attributes inherited from BaseSerializer
Class Method Summary collapse
-
.from_builder(builder, **options) ⇒ Object
-
:builder
- Instance of JsonApiServer::Builder.
-
-
.resource_type(type) ⇒ Object
‘type’ used in #relationship_data.
-
.type ⇒ Object
‘type’ used in #relationship_data and #data.
Instance Method Summary collapse
-
#initialize(object, **options) ⇒ ResourceSerializer
constructor
-
object
- instance of model or presenter or whatever stores data.
-
-
#relationship_data ⇒ Object
Content when #as_json_options [:relationship_data] is specified.
Methods inherited from BaseSerializer
#as_json, #data, #included, #links, #meta
Methods included from ApiVersion
Methods included from Serializer
#as_json, #serializer_options, #to_json
Constructor Details
#initialize(object, **options) ⇒ ResourceSerializer
-
object
- instance of model or presenter or whatever stores data. -
options
- Hash (optional):-
:includes
- Instance of JsonApiServer::Include or nil. Sets #includes. -
:fields
- Instance of JsonApiServer::Fields or nil. Sets #fields.
-
96 97 98 99 100 101 |
# File 'lib/json_api_server/resource_serializer.rb', line 96 def initialize(object, **) super() @object = object @includes = [:includes] @fields = [:fields] end |
Instance Attribute Details
#fields ⇒ Object (readonly)
Hash. Fields requested by user. From the ‘fields’ param. Extracted via JsonApiServer::Fields#sparse_fields which is also available through JsonApiServer::Builder#sparse_fields. Defaults to nil. Set in initializer options.
i.e.,
GET /articles?include=author&fields[articles]=title,body&fields[people]=name becomes:
fields = {'articles' => ['title', 'body'], 'people' => ['name']}
90 91 92 |
# File 'lib/json_api_server/resource_serializer.rb', line 90 def fields @fields end |
#includes ⇒ Object (readonly)
Array. Relationships to include. Array of strings. From the ‘include’ param. Extracted via JsonApiServer::Include#includes which is also available through JsonApiServer::Builder#includes. Defaults to nil. Set in initializer options.
i.e.,
GET /articles?include=comments.author,publisher becomes:
includes = ['comments.author', 'publisher']
79 80 81 |
# File 'lib/json_api_server/resource_serializer.rb', line 79 def includes @includes end |
Class Method Details
.from_builder(builder, **options) ⇒ Object
-
:builder
- Instance of JsonApiServer::Builder.
#object, #includes and #fields will be extracted from it.
-
options
- Hash, override values from Builder or set additional options.-
:includes
- Instance of JsonApiServer::Include or nil. Sets #includes. -
:fields
- Instance of JsonApiServer::Fields or nil. Sets #fields. -
filter
- Instance of JsonApiServer::Filter or nil. Sets #filter. -
:paginator
- Instance of JsonApiServer::Fields or nil. Sets #paginator. -
:as_json_options
- See options at JsonApiServer::BaseSerializer#as_json_options.
-
124 125 126 127 128 129 130 |
# File 'lib/json_api_server/resource_serializer.rb', line 124 def from_builder(builder, **) opts = .merge(fields: [:fields] || builder.sparse_fields, includes: [:includes] || builder.includes, paginator: [:paginator] || builder.paginator, filter: [:filter] || builder.filter) new(builder.query, opts) end |
.resource_type(type) ⇒ Object
‘type’ used in #relationship_data.
112 113 114 |
# File 'lib/json_api_server/resource_serializer.rb', line 112 def resource_type(type) @type = type end |
.type ⇒ Object
‘type’ used in #relationship_data and #data. i.e.:
"data": {"type": "articles", "id": 2}
107 108 109 |
# File 'lib/json_api_server/resource_serializer.rb', line 107 def type @type || type_from_class_name end |
Instance Method Details
#relationship_data ⇒ Object
Content when #as_json_options [:relationship_data] is specified. Defaults to { ‘type’ => <resource_type>, ‘id’ => <@object.id> }. resource_type can be set with class method #resource_type, otherwise it will be guessed from serializer class name.
149 150 151 152 |
# File 'lib/json_api_server/resource_serializer.rb', line 149 def relationship_data id = @object.try(:id) || @object.try(:[], :id) { 'type' => self.class.type, 'id' => id } end |