README.md in active_model_serializers-0.10.0.rc2 vs README.md in active_model_serializers-0.10.0.rc3
- old
+ new
@@ -1,16 +1,20 @@
-# ActiveModel::Serializers
+# ActiveModel::Serializer
[![Build Status](https://travis-ci.org/rails-api/active_model_serializers.svg)](https://travis-ci.org/rails-api/active_model_serializers)
+<a href="https://codeclimate.com/github/rails-api/active_model_serializers"><img src="https://codeclimate.com/github/rails-api/active_model_serializers/badges/gpa.svg" /></a>
+<a href="https://codeclimate.com/github/rails-api/active_model_serializers/coverage"><img src="https://codeclimate.com/github/rails-api/active_model_serializers/badges/coverage.svg" /></a>
-ActiveModel::Serializers brings convention over configuration to your JSON generation.
+_Windows Build Status -_ [![Build status](https://ci.appveyor.com/api/projects/status/x6xdjydutm54gvyt/branch/master?svg=true)](https://ci.appveyor.com/project/joaomdmoura/active-model-serializers/branch/master)
+ActiveModel::Serializer brings convention over configuration to your JSON generation.
+
AMS does this through two components: **serializers** and **adapters**.
Serializers describe _which_ attributes and relationships should be serialized.
Adapters describe _how_ attributes and relationships should be serialized.
-By default AMS will use the **Json Adapter**. But we strongly advise you to use JsonApi Adapter that follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
+By default AMS will use the **Flatten Json Adapter**. But we strongly advise you to use **JsonApi Adapter** that follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
Check how to change the adapter in the sections bellow.
# RELEASE CANDIDATE, PLEASE READ
This is the master branch of AMS. It will become the `0.10.0` release when it's
@@ -21,33 +25,29 @@
architecture. We'd love your help. [Learn how you can help here.](https://github.com/rails-api/active_model_serializers/blob/master/CONTRIBUTING.md)
## Example
Given two models, a `Post(title: string, body: text)` and a
-`Comment(name:string, body:text, post_id:integer)`, you will have two
+`Comment(name: string, body: text, post_id: integer)`, you will have two
serializers:
```ruby
class PostSerializer < ActiveModel::Serializer
cache key: 'posts', expires_in: 3.hours
attributes :title, :body
has_many :comments
-
- url :post
end
```
and
```ruby
class CommentSerializer < ActiveModel::Serializer
attributes :name, :body
belongs_to :post
-
- url [:post, :comment]
end
```
Generally speaking, you as a user of AMS will write (or generate) these
serializer classes. If you want to use a different adapter, such as a JsonApi, you can
@@ -64,10 +64,16 @@
```
You won't need to implement an adapter unless you wish to use a new format or
media type with AMS.
+If you want to have a root key on your responses you should use the Json adapter, instead of the default FlattenJson:
+
+```ruby
+ActiveModel::Serializer.config.adapter = :json
+```
+
If you would like the key in the outputted JSON to be different from its name in ActiveRecord, you can use the :key option to customize it:
```ruby
class PostSerializer < ActiveModel::Serializer
attributes :id, :body
@@ -110,11 +116,11 @@
# Use the default `ArraySerializer`, which will use `each_serializer` to
# serialize each element
render json: @posts, each_serializer: PostPreviewSerializer
# Or, you can explicitly provide the collection serializer as well
-render json: @posts, serializer: PaginatedSerializer, each_serializer: PostPreviewSerializer
+render json: @posts, serializer: CollectionSerializer, each_serializer: PostPreviewSerializer
```
### Meta
If you want a `meta` attribute in your response, specify it in the `render`
@@ -128,20 +134,27 @@
```ruby
render json: @post, meta: { total: 10 }, meta_key: "custom_meta"
```
-`meta` will only be included in your response if there's a root. For instance,
-it won't be included in array responses.
+`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 (FlattenJson) doesn't have `root`.
-### Root key
+### Using a serializer without `render`
-If you want to define a custom root for your response, specify it in the `render`
-call:
+At times, you might want to use a serializer without rendering it to the view. For those cases, you can create an instance of `ActiveModel::SerializableResource` with
+the resource you want to be serialized and call `.serializable_hash`.
```ruby
-render json: @post, root: "articles"
+def create
+ @message = current_user.messages.create!(message_params)
+ MessageCreationWorker.perform(serialized_message)
+ head 204
+end
+
+def serialized_message
+ ActiveModel::SerializableResource.new(@message).serializable_hash
+end
```
### Overriding association methods
If you want to override any association, you can use:
@@ -174,21 +187,31 @@
end
```
### Built in Adapters
+#### FlattenJSON
+
+It's the default adapter, it generates a json response without a root key.
+Doesn't follow any specifc convention.
+
+#### JSON
+
+It also generates a json response but always with a root key. The root key **can't be overridden**, and will be automatically defined accordingly with the objects being serialized.
+Doesn't follow any specifc convention.
+
#### JSONAPI
-This adapter follows RC4 of the format specified in
+This adapter follows 1.0 of the format specified in
[jsonapi.org/format](http://jsonapi.org/format). It will include the associated
resources in the `"included"` member when the resource names are included in the
-`include` option.
+`include` option. Including nested associated resources is also supported.
```ruby
- render @posts, include: ['authors', 'comments']
+ render @posts, include: ['author', 'comments', 'comments.author']
# or
- render @posts, include: 'authors,comments'
+ render @posts, include: 'author,comments,comments.author'
```
## Installation
Add this line to your application's Gemfile:
@@ -227,42 +250,47 @@
class PostSerializer < ActiveModel::Serializer
attributes :title, :body
has_many :comments
has_one :author
-
- url :post
end
```
and
```ruby
class CommentSerializer < ActiveModel::Serializer
attributes :name, :body
belongs_to :post_id
-
- url [:post, :comment]
end
```
The attribute names are a **whitelist** of attributes to be serialized.
The `has_many`, `has_one`, and `belongs_to` declarations describe relationships between
-resources. By default, when you serialize a `Post`, you will get its `Comment`s
+resources. By default, when you serialize a `Post`, you will get its `Comments`
as well.
You may also use the `:serializer` option to specify a custom serializer class, for example:
```ruby
has_many :comments, serializer: CommentPreviewSerializer
```
-The `url` declaration describes which named routes to use while generating URLs
-for your JSON. Not every adapter will require URLs.
+And you can change the JSON key that the serializer should use for a particular association:
+```ruby
+ has_many :comments, key: :reviews
+```
+
+## Pagination
+
+Pagination links will be included in your response automatically as long as the resource is paginated using [Kaminari](https://github.com/amatsuda/kaminari) or [WillPaginate](https://github.com/mislav/will_paginate) and if you are using a ```JSON-API``` adapter.
+
+Although the others adapters does not have this feature, it is possible to implement pagination links to `JSON` adapter. For more information about it, please see in our docs [How to add pagination links](https://github.com/rails-api/active_model_serializers/blob/master/docs/howto/add_pagination_links.md)
+
## Caching
To cache a serializer, call ```cache``` and pass its options.
The options are the same options of ```ActiveSupport::Cache::Store```, plus
a ```key``` option that will be the prefix of the object cache
@@ -270,11 +298,11 @@
The cache support is optimized to use the cached object in multiple request. An object cached on a ```show``` request will be reused at the ```index```. If there is a relationship with another cached serializer it will also be created and reused automatically.
**[NOTE] Every object is individually cached.**
-**[NOTE] The cache is automatically expired after update an object but it's not deleted.**
+**[NOTE] The cache is automatically expired after an object is updated, but it's not deleted.**
```ruby
cache(options = nil) # options: ```{key, expires_in, compress, force, race_condition_ttl}```
```
@@ -284,12 +312,10 @@
class PostSerializer < ActiveModel::Serializer
cache key: 'post', expires_in: 3.hours
attributes :title, :body
has_many :comments
-
- url :post
end
```
On this example every ```Post``` object will be cached with
the key ```"post/#{post.id}-#{post.updated_at}"```. You can use this key to expire it as you want,
@@ -309,11 +335,9 @@
class PostSerializer < ActiveModel::Serializer
cache key: 'post', expires_in: 3.hours, only: [:title]
attributes :title, :body
has_many :comments
-
- url :post
end
```
## Getting Help