active_model_serializers 0.10.9 → 0.10.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +41 -2
- data/README.md +18 -19
- data/lib/action_controller/serialization.rb +9 -1
- data/lib/active_model/serializer/collection_serializer.rb +11 -2
- data/lib/active_model/serializer/concerns/caching.rb +2 -1
- data/lib/active_model/serializer/fieldset.rb +1 -1
- data/lib/active_model/serializer/reflection.rb +4 -4
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model/serializer.rb +13 -4
- data/lib/active_model_serializers/adapter/attributes.rb +21 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
- data/lib/active_model_serializers/model/caching.rb +26 -0
- metadata +20 -292
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -109
- data/.simplecov +0 -110
- data/.travis.yml +0 -63
- data/CODE_OF_CONDUCT.md +0 -74
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -74
- data/Rakefile +0 -76
- data/active_model_serializers.gemspec +0 -64
- data/appveyor.yml +0 -28
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/rubocop +0 -38
- data/bin/serve_benchmark +0 -39
- data/docs/README.md +0 -41
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -269
- data/docs/general/caching.md +0 -58
- data/docs/general/configuration_options.md +0 -185
- data/docs/general/deserialization.md +0 -100
- data/docs/general/fields.md +0 -31
- data/docs/general/getting_started.md +0 -133
- data/docs/general/instrumentation.md +0 -40
- data/docs/general/key_transforms.md +0 -40
- data/docs/general/logging.md +0 -21
- data/docs/general/rendering.md +0 -293
- data/docs/general/serializers.md +0 -495
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -138
- data/docs/howto/add_relationship_links.md +0 -140
- data/docs/howto/add_root_key.md +0 -62
- data/docs/howto/grape_integration.md +0 -42
- data/docs/howto/outside_controller_use.md +0 -66
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -73
- data/docs/howto/test.md +0 -154
- data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
- data/docs/integrations/ember-and-json-api.md +0 -147
- data/docs/integrations/grape.md +0 -19
- data/docs/jsonapi/errors.md +0 -56
- data/docs/jsonapi/schema/schema.json +0 -366
- data/docs/jsonapi/schema.md +0 -151
- data/docs/rfcs/0000-namespace.md +0 -106
- data/docs/rfcs/template.md +0 -15
- data/test/action_controller/adapter_selector_test.rb +0 -64
- data/test/action_controller/explicit_serializer_test.rb +0 -137
- data/test/action_controller/json/include_test.rb +0 -248
- data/test/action_controller/json_api/deserialization_test.rb +0 -114
- data/test/action_controller/json_api/errors_test.rb +0 -42
- data/test/action_controller/json_api/fields_test.rb +0 -68
- data/test/action_controller/json_api/linked_test.rb +0 -204
- data/test/action_controller/json_api/pagination_test.rb +0 -126
- data/test/action_controller/json_api/transform_test.rb +0 -191
- data/test/action_controller/lookup_proc_test.rb +0 -51
- data/test/action_controller/namespace_lookup_test.rb +0 -234
- data/test/action_controller/serialization_scope_name_test.rb +0 -237
- data/test/action_controller/serialization_test.rb +0 -480
- data/test/active_model_serializers/adapter_for_test.rb +0 -210
- data/test/active_model_serializers/json_pointer_test.rb +0 -24
- data/test/active_model_serializers/logging_test.rb +0 -79
- data/test/active_model_serializers/model_test.rb +0 -144
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
- data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
- data/test/active_model_serializers/test/schema_test.rb +0 -133
- data/test/active_model_serializers/test/serializer_test.rb +0 -64
- data/test/active_record_test.rb +0 -11
- data/test/adapter/attributes_test.rb +0 -42
- data/test/adapter/deprecation_test.rb +0 -102
- data/test/adapter/json/belongs_to_test.rb +0 -47
- data/test/adapter/json/collection_test.rb +0 -106
- data/test/adapter/json/has_many_test.rb +0 -55
- data/test/adapter/json/transform_test.rb +0 -95
- data/test/adapter/json_api/belongs_to_test.rb +0 -157
- data/test/adapter/json_api/collection_test.rb +0 -98
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -98
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
- data/test/adapter/json_api/has_many_test.rb +0 -175
- data/test/adapter/json_api/has_one_test.rb +0 -82
- data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -415
- data/test/adapter/json_api/links_test.rb +0 -112
- data/test/adapter/json_api/pagination_links_test.rb +0 -208
- data/test/adapter/json_api/parse_test.rb +0 -139
- data/test/adapter/json_api/relationship_test.rb +0 -399
- data/test/adapter/json_api/resource_meta_test.rb +0 -102
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
- data/test/adapter/json_api/transform_test.rb +0 -514
- data/test/adapter/json_api/type_test.rb +0 -195
- data/test/adapter/json_test.rb +0 -48
- data/test/adapter/null_test.rb +0 -24
- data/test/adapter/polymorphic_test.rb +0 -220
- data/test/adapter_test.rb +0 -69
- data/test/array_serializer_test.rb +0 -24
- data/test/benchmark/app.rb +0 -67
- data/test/benchmark/benchmarking_support.rb +0 -69
- data/test/benchmark/bm_active_record.rb +0 -83
- data/test/benchmark/bm_adapter.rb +0 -40
- data/test/benchmark/bm_caching.rb +0 -121
- data/test/benchmark/bm_lookup_chain.rb +0 -85
- data/test/benchmark/bm_transform.rb +0 -47
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -85
- data/test/benchmark/fixtures.rb +0 -221
- data/test/cache_test.rb +0 -717
- data/test/collection_serializer_test.rb +0 -129
- data/test/fixtures/active_record.rb +0 -115
- data/test/fixtures/poro.rb +0 -227
- data/test/generators/scaffold_controller_generator_test.rb +0 -26
- data/test/generators/serializer_generator_test.rb +0 -77
- data/test/grape_test.rb +0 -198
- data/test/lint_test.rb +0 -51
- data/test/logger_test.rb +0 -22
- data/test/poro_test.rb +0 -11
- data/test/serializable_resource_test.rb +0 -81
- data/test/serializers/association_macros_test.rb +0 -39
- data/test/serializers/associations_test.rb +0 -520
- data/test/serializers/attribute_test.rb +0 -155
- data/test/serializers/attributes_test.rb +0 -54
- data/test/serializers/caching_configuration_test_isolated.rb +0 -172
- data/test/serializers/configuration_test.rb +0 -34
- data/test/serializers/fieldset_test.rb +0 -16
- data/test/serializers/meta_test.rb +0 -204
- data/test/serializers/options_test.rb +0 -34
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
- data/test/serializers/reflection_test.rb +0 -481
- data/test/serializers/root_test.rb +0 -23
- data/test/serializers/serialization_test.rb +0 -57
- data/test/serializers/serializer_for_test.rb +0 -138
- data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -86
- data/test/support/rails5_shims.rb +0 -55
- data/test/support/rails_app.rb +0 -40
- data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
- data/test/support/schemas/custom/show.json +0 -7
- data/test/support/schemas/hyper_schema.json +0 -93
- data/test/support/schemas/render_using_json_api.json +0 -43
- data/test/support/schemas/simple_json_pointers.json +0 -10
- data/test/support/serialization_testing.rb +0 -81
- data/test/test_helper.rb +0 -72
data/docs/general/adapters.md
DELETED
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Adapters
|
|
4
|
-
|
|
5
|
-
ActiveModelSerializers offers the ability to configure which adapter
|
|
6
|
-
to use both globally and/or when serializing (usually when rendering).
|
|
7
|
-
|
|
8
|
-
The global adapter configuration is set on [`ActiveModelSerializers.config`](configuration_options.md).
|
|
9
|
-
It should be set only once, preferably at initialization.
|
|
10
|
-
|
|
11
|
-
For example:
|
|
12
|
-
|
|
13
|
-
```ruby
|
|
14
|
-
ActiveModelSerializers.config.adapter = ActiveModelSerializers::Adapter::JsonApi
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
or
|
|
18
|
-
|
|
19
|
-
```ruby
|
|
20
|
-
ActiveModelSerializers.config.adapter = :json_api
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
or
|
|
24
|
-
|
|
25
|
-
```ruby
|
|
26
|
-
ActiveModelSerializers.config.adapter = :json
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
The local adapter option is in the format `adapter: adapter`, where `adapter` is
|
|
30
|
-
any of the same values as set globally.
|
|
31
|
-
|
|
32
|
-
The configured adapter can be set as a symbol, class, or class name, as described in
|
|
33
|
-
[Advanced adapter configuration](adapters.md#advanced-adapter-configuration).
|
|
34
|
-
|
|
35
|
-
The `Attributes` adapter does not include a root key. It is just the serialized attributes.
|
|
36
|
-
|
|
37
|
-
Use either the `JSON` or `JSON API` adapters if you want the response document to have a root key.
|
|
38
|
-
|
|
39
|
-
***IMPORTANT***: Adapter configuration has *no effect* on a serializer instance
|
|
40
|
-
being used directly. That is, `UserSerializer.new(user).as_json` will *always*
|
|
41
|
-
behave as if the adapter were the 'Attributes' adapter. See [Outside Controller
|
|
42
|
-
Usage](../howto/outside_controller_use.md) for more details on recommended
|
|
43
|
-
usage.
|
|
44
|
-
|
|
45
|
-
## Built in Adapters
|
|
46
|
-
|
|
47
|
-
### Attributes - Default
|
|
48
|
-
|
|
49
|
-
It's the default adapter, it generates a json response without a root key.
|
|
50
|
-
Doesn't follow any specific convention.
|
|
51
|
-
|
|
52
|
-
##### Example output
|
|
53
|
-
|
|
54
|
-
```json
|
|
55
|
-
{
|
|
56
|
-
"title": "Title 1",
|
|
57
|
-
"body": "Body 1",
|
|
58
|
-
"publish_at": "2020-03-16T03:55:25.291Z",
|
|
59
|
-
"author": {
|
|
60
|
-
"first_name": "Bob",
|
|
61
|
-
"last_name": "Jones"
|
|
62
|
-
},
|
|
63
|
-
"comments": [
|
|
64
|
-
{
|
|
65
|
-
"body": "cool"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"body": "awesome"
|
|
69
|
-
}
|
|
70
|
-
]
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### JSON
|
|
75
|
-
|
|
76
|
-
The json response is always rendered with a root key.
|
|
77
|
-
|
|
78
|
-
The root key can be overridden by:
|
|
79
|
-
* passing the `root` option in the render call. See details in the [Rendering Guides](rendering.md#overriding-the-root-key).
|
|
80
|
-
* setting the `type` of the serializer. See details in the [Serializers Guide](serializers.md#type).
|
|
81
|
-
|
|
82
|
-
Doesn't follow any specific convention.
|
|
83
|
-
|
|
84
|
-
##### Example output
|
|
85
|
-
|
|
86
|
-
```json
|
|
87
|
-
{
|
|
88
|
-
"post": {
|
|
89
|
-
"title": "Title 1",
|
|
90
|
-
"body": "Body 1",
|
|
91
|
-
"publish_at": "2020-03-16T03:55:25.291Z",
|
|
92
|
-
"author": {
|
|
93
|
-
"first_name": "Bob",
|
|
94
|
-
"last_name": "Jones"
|
|
95
|
-
},
|
|
96
|
-
"comments": [{
|
|
97
|
-
"body": "cool"
|
|
98
|
-
}, {
|
|
99
|
-
"body": "awesome"
|
|
100
|
-
}]
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### JSON API
|
|
106
|
-
|
|
107
|
-
This adapter follows **version 1.0** of the [format specified](../jsonapi/schema.md) in
|
|
108
|
-
[jsonapi.org/format](http://jsonapi.org/format).
|
|
109
|
-
|
|
110
|
-
##### Example output
|
|
111
|
-
|
|
112
|
-
```json
|
|
113
|
-
{
|
|
114
|
-
"data": {
|
|
115
|
-
"id": "1337",
|
|
116
|
-
"type": "posts",
|
|
117
|
-
"attributes": {
|
|
118
|
-
"title": "Title 1",
|
|
119
|
-
"body": "Body 1",
|
|
120
|
-
"publish-at": "2020-03-16T03:55:25.291Z"
|
|
121
|
-
},
|
|
122
|
-
"relationships": {
|
|
123
|
-
"author": {
|
|
124
|
-
"data": {
|
|
125
|
-
"id": "1",
|
|
126
|
-
"type": "authors"
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
"comments": {
|
|
130
|
-
"data": [{
|
|
131
|
-
"id": "7",
|
|
132
|
-
"type": "comments"
|
|
133
|
-
}, {
|
|
134
|
-
"id": "12",
|
|
135
|
-
"type": "comments"
|
|
136
|
-
}]
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
"links": {
|
|
140
|
-
"post-authors": "https://example.com/post_authors"
|
|
141
|
-
},
|
|
142
|
-
"meta": {
|
|
143
|
-
"rating": 5,
|
|
144
|
-
"favorite-count": 10
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Include option
|
|
151
|
-
|
|
152
|
-
Which [serializer associations](https://github.com/rails-api/active_model_serializers/blob/master/docs/general/serializers.md#associations) are rendered can be specified using the `include` option. The option usage is consistent with [the include option in the JSON API spec](http://jsonapi.org/format/#fetching-includes), and is available in all adapters.
|
|
153
|
-
|
|
154
|
-
Example of the usage:
|
|
155
|
-
```ruby
|
|
156
|
-
render json: @posts, include: ['author', 'comments', 'comments.author']
|
|
157
|
-
# or
|
|
158
|
-
render json: @posts, include: 'author,comments,comments.author'
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
The format of the `include` option can be either:
|
|
162
|
-
|
|
163
|
-
- a String composed of a comma-separated list of [relationship paths](http://jsonapi.org/format/#fetching-includes).
|
|
164
|
-
- an Array of Symbols and Hashes.
|
|
165
|
-
- a mix of both.
|
|
166
|
-
|
|
167
|
-
An empty string or an empty array will prevent rendering of any associations.
|
|
168
|
-
|
|
169
|
-
In addition, two types of wildcards may be used:
|
|
170
|
-
|
|
171
|
-
- `*` includes one level of associations.
|
|
172
|
-
- `**` includes all recursively.
|
|
173
|
-
|
|
174
|
-
These can be combined with other paths.
|
|
175
|
-
|
|
176
|
-
```ruby
|
|
177
|
-
render json: @posts, include: '**' # or '*' for a single layer
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
The following would render posts and include:
|
|
182
|
-
|
|
183
|
-
- the author
|
|
184
|
-
- the author's comments, and
|
|
185
|
-
- every resource referenced by the author's comments (recursively).
|
|
186
|
-
|
|
187
|
-
It could be combined, like above, with other paths in any combination desired.
|
|
188
|
-
|
|
189
|
-
```ruby
|
|
190
|
-
render json: @posts, include: 'author.comments.**'
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
**Note:** Wildcards are ActiveModelSerializers-specific, they are not part of the JSON API spec.
|
|
194
|
-
|
|
195
|
-
The default include for the JSON API adapter is no associations. The default for the JSON and Attributes adapters is all associations.
|
|
196
|
-
|
|
197
|
-
For the JSON API adapter associated resources will be gathered in the `"included"` member. For the JSON and Attributes
|
|
198
|
-
adapters associated resources will be rendered among the other attributes.
|
|
199
|
-
|
|
200
|
-
Only for the JSON API adapter you can specify, which attributes of associated resources will be rendered. This feature
|
|
201
|
-
is called [sparse fieldset](http://jsonapi.org/format/#fetching-sparse-fieldsets):
|
|
202
|
-
|
|
203
|
-
```ruby
|
|
204
|
-
render json: @posts, include: 'comments', fields: { comments: ['content', 'created_at'] }
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
##### Security Considerations
|
|
208
|
-
|
|
209
|
-
Since the included options may come from the query params (i.e. user-controller):
|
|
210
|
-
|
|
211
|
-
```ruby
|
|
212
|
-
render json: @posts, include: params[:include]
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
The user could pass in `include=**`.
|
|
216
|
-
|
|
217
|
-
We recommend filtering any user-supplied includes appropriately.
|
|
218
|
-
|
|
219
|
-
## Advanced adapter configuration
|
|
220
|
-
|
|
221
|
-
### Registering an adapter
|
|
222
|
-
|
|
223
|
-
The default adapter can be configured, as above, to use any class given to it.
|
|
224
|
-
|
|
225
|
-
An adapter may also be specified, e.g. when rendering, as a class or as a symbol.
|
|
226
|
-
If a symbol, then the adapter must be, e.g. `:great_example`,
|
|
227
|
-
`ActiveModelSerializers::Adapter::GreatExample`, or registered.
|
|
228
|
-
|
|
229
|
-
There are two ways to register an adapter:
|
|
230
|
-
|
|
231
|
-
1) The simplest, is to subclass `ActiveModelSerializers::Adapter::Base`, e.g. the below will
|
|
232
|
-
register the `Example::UsefulAdapter` as `"example/useful_adapter"`.
|
|
233
|
-
|
|
234
|
-
```ruby
|
|
235
|
-
module Example
|
|
236
|
-
class UsefulAdapter < ActiveModelSerializers::Adapter::Base
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
You'll notice that the name it registers is the underscored namespace and class.
|
|
242
|
-
|
|
243
|
-
Under the covers, when the `ActiveModelSerializers::Adapter::Base` is subclassed, it registers
|
|
244
|
-
the subclass as `register("example/useful_adapter", Example::UsefulAdapter)`
|
|
245
|
-
|
|
246
|
-
2) Any class can be registered as an adapter by calling `register` directly on the
|
|
247
|
-
`ActiveModelSerializers::Adapter` class. e.g., the below registers `MyAdapter` as
|
|
248
|
-
`:special_adapter`.
|
|
249
|
-
|
|
250
|
-
```ruby
|
|
251
|
-
class MyAdapter; end
|
|
252
|
-
ActiveModelSerializers::Adapter.register(:special_adapter, MyAdapter)
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### Looking up an adapter
|
|
256
|
-
|
|
257
|
-
| Method | Return value |
|
|
258
|
-
| :------------ |:---------------|
|
|
259
|
-
| `ActiveModelSerializers::Adapter.adapter_map` | A Hash of all known adapters `{ adapter_name => adapter_class }` |
|
|
260
|
-
| `ActiveModelSerializers::Adapter.adapters` | A (sorted) Array of all known `adapter_names` |
|
|
261
|
-
| `ActiveModelSerializers::Adapter.lookup(name_or_klass)` | The `adapter_class`, else raises an `ActiveModelSerializers::Adapter::UnknownAdapter` error |
|
|
262
|
-
| `ActiveModelSerializers::Adapter.adapter_class(adapter)` | Delegates to `ActiveModelSerializers::Adapter.lookup(adapter)` |
|
|
263
|
-
| `ActiveModelSerializers::Adapter.configured_adapter` | A convenience method for `ActiveModelSerializers::Adapter.lookup(config.adapter)` |
|
|
264
|
-
|
|
265
|
-
The registered adapter name is always a String, but may be looked up as a Symbol or String.
|
|
266
|
-
Helpfully, the Symbol or String is underscored, so that `get(:my_adapter)` and `get("MyAdapter")`
|
|
267
|
-
may both be used.
|
|
268
|
-
|
|
269
|
-
For more information, see [the Adapter class on GitHub](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/adapter.rb)
|
data/docs/general/caching.md
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Caching
|
|
4
|
-
|
|
5
|
-
## Warning
|
|
6
|
-
|
|
7
|
-
There is currently a problem with caching in AMS [Caching doesn't improve performance](https://github.com/rails-api/active_model_serializers/issues/1586). Adding caching _may_ slow down your application, rather than speeding it up. We suggest you benchmark any caching you implement before using in a production enviroment
|
|
8
|
-
|
|
9
|
-
___
|
|
10
|
-
|
|
11
|
-
To cache a serializer, call ```cache``` and pass its options.
|
|
12
|
-
The options are the same options of ```ActiveSupport::Cache::Store```, plus
|
|
13
|
-
a ```key``` option that will be the prefix of the object cache
|
|
14
|
-
on a pattern ```"#{key}/#{object.id}-#{object.updated_at}"```.
|
|
15
|
-
|
|
16
|
-
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.
|
|
17
|
-
|
|
18
|
-
**[NOTE] Every object is individually cached.**
|
|
19
|
-
|
|
20
|
-
**[NOTE] The cache is automatically expired after an object is updated, but it's not deleted.**
|
|
21
|
-
|
|
22
|
-
```ruby
|
|
23
|
-
cache(options = nil) # options: ```{key, expires_in, compress, force, race_condition_ttl}```
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Take the example below:
|
|
27
|
-
|
|
28
|
-
```ruby
|
|
29
|
-
class PostSerializer < ActiveModel::Serializer
|
|
30
|
-
cache key: 'post', expires_in: 3.hours
|
|
31
|
-
attributes :title, :body
|
|
32
|
-
|
|
33
|
-
has_many :comments
|
|
34
|
-
end
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
On this example every ```Post``` object will be cached with
|
|
38
|
-
the key ```"post/#{post.id}-#{post.updated_at}"```. You can use this key to expire it as you want,
|
|
39
|
-
but in this case it will be automatically expired after 3 hours.
|
|
40
|
-
|
|
41
|
-
## Fragment Caching
|
|
42
|
-
|
|
43
|
-
If there is some API endpoint that shouldn't be fully cached, you can still optimise it, using Fragment Cache on the attributes and relationships that you want to cache.
|
|
44
|
-
|
|
45
|
-
You can define the attribute by using ```only``` or ```except``` option on cache method.
|
|
46
|
-
|
|
47
|
-
**[NOTE] Cache serializers will be used at their relationships**
|
|
48
|
-
|
|
49
|
-
Example:
|
|
50
|
-
|
|
51
|
-
```ruby
|
|
52
|
-
class PostSerializer < ActiveModel::Serializer
|
|
53
|
-
cache key: 'post', expires_in: 3.hours, only: [:title]
|
|
54
|
-
attributes :title, :body
|
|
55
|
-
|
|
56
|
-
has_many :comments
|
|
57
|
-
end
|
|
58
|
-
```
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Configuration Options
|
|
4
|
-
|
|
5
|
-
The following configuration options can be set on
|
|
6
|
-
`ActiveModelSerializers.config`, preferably inside an initializer.
|
|
7
|
-
|
|
8
|
-
## General
|
|
9
|
-
|
|
10
|
-
##### adapter
|
|
11
|
-
|
|
12
|
-
The [adapter](adapters.md) to use.
|
|
13
|
-
|
|
14
|
-
Possible values:
|
|
15
|
-
|
|
16
|
-
- `:attributes` (default)
|
|
17
|
-
- `:json`
|
|
18
|
-
- `:json_api`
|
|
19
|
-
|
|
20
|
-
##### serializer_lookup_enabled
|
|
21
|
-
|
|
22
|
-
Enable automatic serializer lookup.
|
|
23
|
-
|
|
24
|
-
Possible values:
|
|
25
|
-
|
|
26
|
-
- `true` (default)
|
|
27
|
-
- `false`
|
|
28
|
-
|
|
29
|
-
When `false`, serializers must be explicitly specified.
|
|
30
|
-
|
|
31
|
-
##### key_transform
|
|
32
|
-
|
|
33
|
-
The [key transform](key_transforms.md) to use.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
| Option | Result |
|
|
37
|
-
|----|----|
|
|
38
|
-
| `:camel` | ExampleKey |
|
|
39
|
-
| `:camel_lower` | exampleKey |
|
|
40
|
-
| `:dash` | example-key |
|
|
41
|
-
| `:unaltered` | the original, unaltered key |
|
|
42
|
-
| `:underscore` | example_key |
|
|
43
|
-
| `nil` | use the adapter default |
|
|
44
|
-
|
|
45
|
-
Each adapter has a default key transform configured:
|
|
46
|
-
|
|
47
|
-
| Adapter | Default Key Transform |
|
|
48
|
-
|----|----|
|
|
49
|
-
| `Attributes` | `:unaltered` |
|
|
50
|
-
| `Json` | `:unaltered` |
|
|
51
|
-
| `JsonApi` | `:dash` |
|
|
52
|
-
|
|
53
|
-
`config.key_transform` is a global override of the adapter default. Adapters
|
|
54
|
-
still prefer the render option `:key_transform` over this setting.
|
|
55
|
-
|
|
56
|
-
*NOTE: Key transforms can be expensive operations. If key transforms are unnecessary for the
|
|
57
|
-
application, setting `config.key_transform` to `:unaltered` will provide a performance boost.*
|
|
58
|
-
|
|
59
|
-
##### default_includes
|
|
60
|
-
|
|
61
|
-
What relationships to serialize by default. Default: `'*'`, which includes one level of related
|
|
62
|
-
objects. See [includes](adapters.md#included) for more info.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
##### serializer_lookup_chain
|
|
66
|
-
|
|
67
|
-
Configures how serializers are searched for. By default, the lookup chain is
|
|
68
|
-
|
|
69
|
-
```ruby
|
|
70
|
-
ActiveModelSerializers::LookupChain::DEFAULT
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
which is shorthand for
|
|
74
|
-
|
|
75
|
-
```ruby
|
|
76
|
-
[
|
|
77
|
-
ActiveModelSerializers::LookupChain::BY_PARENT_SERIALIZER,
|
|
78
|
-
ActiveModelSerializers::LookupChain::BY_NAMESPACE,
|
|
79
|
-
ActiveModelSerializers::LookupChain::BY_RESOURCE_NAMESPACE,
|
|
80
|
-
ActiveModelSerializers::LookupChain::BY_RESOURCE
|
|
81
|
-
]
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Each of the array entries represent a proc. A serializer lookup proc will be yielded 3 arguments. `resource_class`, `serializer_class`, and `namespace`.
|
|
85
|
-
|
|
86
|
-
Note that:
|
|
87
|
-
- `resource_class` is the class of the resource being rendered
|
|
88
|
-
- by default `serializer_class` is `ActiveModel::Serializer`
|
|
89
|
-
- for association lookup it's the "parent" serializer
|
|
90
|
-
- `namespace` correspond to either the controller namespace or the [optionally] specified [namespace render option](./rendering.md#namespace)
|
|
91
|
-
|
|
92
|
-
An example config could be:
|
|
93
|
-
|
|
94
|
-
```ruby
|
|
95
|
-
ActiveModelSerializers.config.serializer_lookup_chain = [
|
|
96
|
-
lambda do |resource_class, serializer_class, namespace|
|
|
97
|
-
"API::#{namespace}::#{resource_class}"
|
|
98
|
-
end
|
|
99
|
-
]
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
If you simply want to add to the existing lookup_chain. Use `unshift`.
|
|
103
|
-
|
|
104
|
-
```ruby
|
|
105
|
-
ActiveModelSerializers.config.serializer_lookup_chain.unshift(
|
|
106
|
-
lambda do |resource_class, serializer_class, namespace|
|
|
107
|
-
# ...
|
|
108
|
-
end
|
|
109
|
-
)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
See [lookup_chain.rb](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/lookup_chain.rb) for further explanations and examples.
|
|
113
|
-
|
|
114
|
-
## JSON API
|
|
115
|
-
|
|
116
|
-
##### jsonapi_resource_type
|
|
117
|
-
|
|
118
|
-
Sets whether the [type](http://jsonapi.org/format/#document-resource-identifier-objects)
|
|
119
|
-
of the resource should be `singularized` or `pluralized` when it is not
|
|
120
|
-
[explicitly specified by the serializer](https://github.com/rails-api/active_model_serializers/blob/master/docs/general/serializers.md#type)
|
|
121
|
-
|
|
122
|
-
Possible values:
|
|
123
|
-
|
|
124
|
-
- `:singular`
|
|
125
|
-
- `:plural` (default)
|
|
126
|
-
|
|
127
|
-
##### jsonapi_namespace_separator
|
|
128
|
-
|
|
129
|
-
Sets separator string for namespaced models to render `type` attribute.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| Separator | Example: Admin::User |
|
|
133
|
-
|----|----|
|
|
134
|
-
| `'-'` (default) | 'admin-users'
|
|
135
|
-
| `'--'` (recommended) | 'admin--users'
|
|
136
|
-
|
|
137
|
-
See [Recommendation for dasherizing (kebab-case-ing) namespaced object, such as `Admin::User`](https://github.com/json-api/json-api/issues/850)
|
|
138
|
-
for more discussion.
|
|
139
|
-
|
|
140
|
-
##### jsonapi_include_toplevel_object
|
|
141
|
-
|
|
142
|
-
Include a [top level jsonapi member](http://jsonapi.org/format/#document-jsonapi-object)
|
|
143
|
-
in the response document.
|
|
144
|
-
|
|
145
|
-
Possible values:
|
|
146
|
-
|
|
147
|
-
- `true`
|
|
148
|
-
- `false` (default)
|
|
149
|
-
|
|
150
|
-
##### jsonapi_version
|
|
151
|
-
|
|
152
|
-
The latest version of the spec to which the API conforms.
|
|
153
|
-
|
|
154
|
-
Default: `'1.0'`.
|
|
155
|
-
|
|
156
|
-
*Used when `jsonapi_include_toplevel_object` is `true`*
|
|
157
|
-
|
|
158
|
-
##### jsonapi_toplevel_meta
|
|
159
|
-
|
|
160
|
-
Optional top-level metadata. Not included if empty.
|
|
161
|
-
|
|
162
|
-
Default: `{}`.
|
|
163
|
-
|
|
164
|
-
*Used when `jsonapi_include_toplevel_object` is `true`*
|
|
165
|
-
|
|
166
|
-
##### jsonapi_use_foreign_key_on_belongs_to_relationship
|
|
167
|
-
|
|
168
|
-
When true, the relationship will determine its resource object identifier
|
|
169
|
-
without calling the association or its serializer. This can be useful when calling
|
|
170
|
-
the association object is triggering unnecessary queries.
|
|
171
|
-
|
|
172
|
-
For example, if a `comment` belongs to a `post`, and the comment
|
|
173
|
-
uses the foreign key `post_id`, we can determine the resource object
|
|
174
|
-
identifier `id` as `comment.post_id` and the `type` from the association options.
|
|
175
|
-
Or quite simply, it behaves as `belongs_to :post, type: :posts, foreign_key: :post_id`.
|
|
176
|
-
|
|
177
|
-
Note: This option has *no effect* on polymorphic associations as we cannot reliably
|
|
178
|
-
determine the associated object's type without instantiating it.
|
|
179
|
-
|
|
180
|
-
Default: `false`.
|
|
181
|
-
|
|
182
|
-
## Hooks
|
|
183
|
-
|
|
184
|
-
To run a hook when ActiveModelSerializers is loaded, use
|
|
185
|
-
`ActiveSupport.on_load(:action_controller) do end`
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Deserialization
|
|
4
|
-
|
|
5
|
-
This is currently an *experimental* feature. The interface may change.
|
|
6
|
-
|
|
7
|
-
## JSON API
|
|
8
|
-
|
|
9
|
-
The `ActiveModelSerializers::Deserialization` defines two methods (namely `jsonapi_parse` and `jsonapi_parse!`), which take a `Hash` or an instance of `ActionController::Parameters` representing a JSON API payload, and return a hash that can directly be used to create/update models. The bang version throws an `InvalidDocument` exception when parsing fails, whereas the "safe" version simply returns an empty hash.
|
|
10
|
-
|
|
11
|
-
- Parameters
|
|
12
|
-
- document: `Hash` or `ActionController::Parameters` instance
|
|
13
|
-
- options:
|
|
14
|
-
- only: `Array` of whitelisted fields
|
|
15
|
-
- except: `Array` of blacklisted fields
|
|
16
|
-
- keys: `Hash` of fields the name of which needs to be modified (e.g. `{ :author => :user, :date => :created_at }`)
|
|
17
|
-
|
|
18
|
-
Examples:
|
|
19
|
-
|
|
20
|
-
```ruby
|
|
21
|
-
class PostsController < ActionController::Base
|
|
22
|
-
def create
|
|
23
|
-
Post.create(create_params)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def create_params
|
|
27
|
-
ActiveModelSerializers::Deserialization.jsonapi_parse(params, only: [:title, :content, :author])
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
Given a JSON API document,
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
document = {
|
|
38
|
-
'data' => {
|
|
39
|
-
'id' => 1,
|
|
40
|
-
'type' => 'post',
|
|
41
|
-
'attributes' => {
|
|
42
|
-
'title' => 'Title 1',
|
|
43
|
-
'date' => '2015-12-20'
|
|
44
|
-
},
|
|
45
|
-
'relationships' => {
|
|
46
|
-
'author' => {
|
|
47
|
-
'data' => {
|
|
48
|
-
'type' => 'user',
|
|
49
|
-
'id' => '2'
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
'second_author' => {
|
|
53
|
-
'data' => nil
|
|
54
|
-
},
|
|
55
|
-
'comments' => {
|
|
56
|
-
'data' => [{
|
|
57
|
-
'type' => 'comment',
|
|
58
|
-
'id' => '3'
|
|
59
|
-
},{
|
|
60
|
-
'type' => 'comment',
|
|
61
|
-
'id' => '4'
|
|
62
|
-
}]
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
The entire document can be parsed without specifying any options:
|
|
70
|
-
```ruby
|
|
71
|
-
ActiveModelSerializers::Deserialization.jsonapi_parse(document)
|
|
72
|
-
#=>
|
|
73
|
-
# {
|
|
74
|
-
# title: 'Title 1',
|
|
75
|
-
# date: '2015-12-20',
|
|
76
|
-
# author_id: 2,
|
|
77
|
-
# second_author_id: nil
|
|
78
|
-
# comment_ids: [3, 4]
|
|
79
|
-
# }
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
and fields, relationships, and polymorphic relationships can be specified via the options:
|
|
83
|
-
|
|
84
|
-
```ruby
|
|
85
|
-
ActiveModelSerializers::Deserialization
|
|
86
|
-
.jsonapi_parse(document, only: [:title, :date, :author],
|
|
87
|
-
keys: { date: :published_at },
|
|
88
|
-
polymorphic: [:author])
|
|
89
|
-
#=>
|
|
90
|
-
# {
|
|
91
|
-
# title: 'Title 1',
|
|
92
|
-
# published_at: '2015-12-20',
|
|
93
|
-
# author_id: '2',
|
|
94
|
-
# author_type: 'user'
|
|
95
|
-
# }
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Attributes/Json
|
|
99
|
-
|
|
100
|
-
There is currently no deserialization for those adapters.
|
data/docs/general/fields.md
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Fields
|
|
4
|
-
|
|
5
|
-
If for any reason, you need to restrict the fields returned, you should use `fields` option.
|
|
6
|
-
|
|
7
|
-
For example, if you have a serializer like this
|
|
8
|
-
|
|
9
|
-
```ruby
|
|
10
|
-
class UserSerializer < ActiveModel::Serializer
|
|
11
|
-
attributes :access_token, :first_name, :last_name
|
|
12
|
-
end
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
and in a specific controller, you want to return `access_token` only, `fields` will help you:
|
|
16
|
-
|
|
17
|
-
```ruby
|
|
18
|
-
class AnonymousController < ApplicationController
|
|
19
|
-
def create
|
|
20
|
-
render json: User.create(activation_state: 'anonymous'), fields: [:access_token], status: 201
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Note that this is only valid for the `json` and `attributes` adapter. For the `json_api` adapter, you would use
|
|
26
|
-
|
|
27
|
-
```ruby
|
|
28
|
-
render json: @user, fields: { users: [:access_token] }
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Where `users` is the JSONAPI type.
|