mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 06:16:50 +00:00
122 lines
3.1 KiB
Markdown
122 lines
3.1 KiB
Markdown
[Back to Guides](../README.md)
|
|
|
|
# How to add pagination links
|
|
|
|
### JSON API adapter
|
|
|
|
Pagination links will be included in your response automatically as long as
|
|
the resource is paginated and if you are using the ```JsonApi``` adapter.
|
|
|
|
If you want pagination links in your response, use [Kaminari](https://github.com/amatsuda/kaminari)
|
|
or [WillPaginate](https://github.com/mislav/will_paginate).
|
|
|
|
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
|
|
|
|
###### Kaminari examples
|
|
|
|
```ruby
|
|
#array
|
|
@posts = Kaminari.paginate_array([1, 2, 3]).page(3).per(1)
|
|
render json: @posts
|
|
|
|
#active_record
|
|
@posts = Post.page(3).per(1)
|
|
render json: @posts
|
|
```
|
|
|
|
###### WillPaginate examples
|
|
|
|
```ruby
|
|
#array
|
|
@posts = [1,2,3].paginate(page: 3, per_page: 1)
|
|
render json: @posts
|
|
|
|
#active_record
|
|
@posts = Post.page(3).per_page(1)
|
|
render json: @posts
|
|
```
|
|
|
|
```ruby
|
|
ActiveModelSerializers.config.adapter = :json_api
|
|
```
|
|
|
|
ex:
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"type": "articles",
|
|
"id": "3",
|
|
"attributes": {
|
|
"title": "JSON API paints my bikeshed!",
|
|
"body": "The shortest article. Ever.",
|
|
"created": "2015-05-22T14:56:29.000Z",
|
|
"updated": "2015-05-22T14:56:28.000Z"
|
|
}
|
|
}
|
|
],
|
|
"links": {
|
|
"self": "http://example.com/articles?page[number]=3&page[size]=1",
|
|
"first": "http://example.com/articles?page[number]=1&page[size]=1",
|
|
"prev": "http://example.com/articles?page[number]=2&page[size]=1",
|
|
"next": "http://example.com/articles?page[number]=4&page[size]=1",
|
|
"last": "http://example.com/articles?page[number]=13&page[size]=1"
|
|
}
|
|
}
|
|
```
|
|
|
|
ActiveModelSerializers pagination relies on a paginated collection with the methods `current_page`, `total_pages`, and `size`, such as are supported by both [Kaminari](https://github.com/amatsuda/kaminari) or [WillPaginate](https://github.com/mislav/will_paginate).
|
|
|
|
|
|
### JSON adapter
|
|
|
|
If you are using `JSON` adapter, pagination links will not be included automatically, but it is possible to do so using `meta` key.
|
|
|
|
In your action specify a custom serializer.
|
|
```ruby
|
|
render json: @posts, serializer: PaginatedSerializer, each_serializer: PostPreviewSerializer
|
|
```
|
|
|
|
And then, you could do something like the following class.
|
|
```ruby
|
|
class PaginatedSerializer < ActiveModel::Serializer::CollectionSerializer
|
|
def initialize(object, options={})
|
|
meta_key = options[:meta_key] || :meta
|
|
options[meta_key] ||= {}
|
|
options[meta_key] = {
|
|
current_page: object.current_page,
|
|
next_page: object.next_page,
|
|
prev_page: object.prev_page,
|
|
total_pages: object.total_pages,
|
|
total_count: object.total_count
|
|
}
|
|
super(object, options)
|
|
end
|
|
end
|
|
```
|
|
ex.
|
|
```json
|
|
{
|
|
"articles": [
|
|
{
|
|
"id": 2,
|
|
"title": "JSON API paints my bikeshed!",
|
|
"body": "The shortest article. Ever."
|
|
}
|
|
],
|
|
"meta": {
|
|
"current_page": 3,
|
|
"next_page": 4,
|
|
"prev_page": 2,
|
|
"total_pages": 10,
|
|
"total_count": 10
|
|
}
|
|
}
|
|
```
|
|
|
|
### Attributes adapter
|
|
|
|
This adapter does not allow us to use `meta` key, due to that it is not possible to add pagination links.
|