In your controllers, when you use render :json
, Rails will now first search
for a serializer for the object and use it if available.
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
render json: @post
end
end
In this case, Rails will look for a serializer named PostSerializer
, and if
it exists, use it to serialize the Post
.
If you wish to use a serializer other than the default, you can explicitly pass it to the renderer.
render json: @post, serializer: PostPreviewSerializer
Specify the serializer for each resource with each_serializer
render json: @posts, each_serializer: PostPreviewSerializer
The default serializer for collections is CollectionSerializer
.
Specify the collection serializer with the serializer
option.
render json: @posts, serializer: CollectionSerializer, each_serializer: PostPreviewSerializer
All serializable resources must pass the ActiveModel::Serializer::Lint::Tests.
See the ActiveModelSerializers::Model for a base class that implements the full API for a plain-old Ruby object (PORO).
The options
hash passed to render
or ActiveModel::SerializableResource.new(resource, options)
are partitioned into serializer_opts
and adapter_opts
. adapter_opts
are passed to new Adapters;
serializer_opts
are passed to new Serializers.
The adapter_opts
are specified in ActiveModel::SerializableResource::ADAPTER_OPTIONS.
The serializer_opts
are the remaining options.
(In Rails, the options
are also passed to the as_json(options)
or to_json(options)
methods on the resource serialization by the Rails JSON renderer. They are, therefore, important
to know about, but not part of ActiveModelSerializers.)
See ARCHITECTURE for more information.
PR please :)
PR please :)
If you want a meta
attribute in your response, specify it in the render
call:
render json: @post, meta: { total: 10 }
The key can be customized using meta_key
option.
render json: @post, meta: { total: 10 }, meta_key: "custom_meta"
meta
will only be included in your response if you are using an Adapter that supports root
,
as JsonAPI and Json adapters, the default adapter (Attributes) doesn't have root
.
PR please :)
PR please :)
PR please :)
The resource root is derived from the class name of the resource being serialized.
e.g. UserPostSerializer.new(UserPost.new)
will be serialized with the root user_post
or user_posts
according the adapter collection pluralization rules.
Specify the root by passing it as an argument to render
. For example:
render json: @user_post, root: "admin_post", adapter: :json
This will be rendered as:
{
"admin_post": {
"title": "how to do open source"
}
}
Note: the Attributes
adapter (default) does not include a resource root.
PR please :)
PR please :)
PR please :)