active_model_serializers 0.10.0 → 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 +5 -5
- data/CHANGELOG.md +239 -2
- data/README.md +171 -34
- data/lib/action_controller/serialization.rb +23 -3
- data/lib/active_model/serializable_resource.rb +2 -0
- data/lib/active_model/serializer/adapter/attributes.rb +2 -0
- data/lib/active_model/serializer/adapter/base.rb +4 -0
- data/lib/active_model/serializer/adapter/json.rb +2 -0
- data/lib/active_model/serializer/adapter/json_api.rb +2 -0
- data/lib/active_model/serializer/adapter/null.rb +2 -0
- data/lib/active_model/serializer/adapter.rb +2 -0
- data/lib/active_model/serializer/array_serializer.rb +10 -5
- data/lib/active_model/serializer/association.rb +64 -10
- data/lib/active_model/serializer/attribute.rb +2 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +6 -3
- data/lib/active_model/serializer/collection_serializer.rb +48 -13
- data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +89 -117
- data/lib/active_model/serializer/error_serializer.rb +13 -7
- data/lib/active_model/serializer/errors_serializer.rb +27 -20
- data/lib/active_model/serializer/field.rb +2 -0
- data/lib/active_model/serializer/fieldset.rb +3 -1
- data/lib/active_model/serializer/has_many_reflection.rb +5 -3
- data/lib/active_model/serializer/has_one_reflection.rb +3 -4
- data/lib/active_model/serializer/lazy_association.rb +99 -0
- data/lib/active_model/serializer/link.rb +23 -0
- data/lib/active_model/serializer/lint.rb +136 -130
- data/lib/active_model/serializer/null.rb +2 -0
- data/lib/active_model/serializer/reflection.rb +130 -65
- data/lib/active_model/serializer/version.rb +3 -1
- data/lib/active_model/serializer.rb +321 -86
- data/lib/active_model_serializers/adapter/attributes.rb +17 -57
- data/lib/active_model_serializers/adapter/base.rb +41 -39
- data/lib/active_model_serializers/adapter/json.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
- data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/link.rb +3 -1
- data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
- data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +52 -20
- data/lib/active_model_serializers/adapter/json_api/relationship.rb +77 -23
- data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +41 -10
- data/lib/active_model_serializers/adapter/json_api.rb +84 -65
- data/lib/active_model_serializers/adapter/null.rb +2 -0
- data/lib/active_model_serializers/adapter.rb +9 -1
- data/lib/active_model_serializers/callbacks.rb +2 -0
- data/lib/active_model_serializers/deprecate.rb +3 -2
- data/lib/active_model_serializers/deserialization.rb +4 -0
- data/lib/active_model_serializers/json_pointer.rb +2 -0
- data/lib/active_model_serializers/logging.rb +2 -0
- data/lib/active_model_serializers/lookup_chain.rb +82 -0
- data/lib/active_model_serializers/model/caching.rb +26 -0
- data/lib/active_model_serializers/model.rb +111 -28
- data/lib/active_model_serializers/railtie.rb +7 -1
- data/lib/active_model_serializers/register_jsonapi_renderer.rb +46 -31
- data/lib/active_model_serializers/serializable_resource.rb +10 -7
- data/lib/active_model_serializers/serialization_context.rb +12 -3
- data/lib/active_model_serializers/test/schema.rb +4 -2
- data/lib/active_model_serializers/test/serializer.rb +2 -0
- data/lib/active_model_serializers/test.rb +2 -0
- data/lib/active_model_serializers.rb +35 -10
- data/lib/generators/rails/resource_override.rb +3 -1
- data/lib/generators/rails/serializer_generator.rb +6 -4
- data/lib/grape/active_model_serializers.rb +9 -5
- data/lib/grape/formatters/active_model_serializers.rb +21 -2
- data/lib/grape/helpers/active_model_serializers.rb +3 -0
- data/lib/tasks/rubocop.rake +55 -0
- metadata +104 -296
- data/.github/ISSUE_TEMPLATE.md +0 -29
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
- data/.gitignore +0 -35
- data/.rubocop.yml +0 -104
- data/.rubocop_todo.yml +0 -167
- data/.simplecov +0 -110
- data/.travis.yml +0 -43
- data/CONTRIBUTING.md +0 -105
- data/Gemfile +0 -53
- data/Rakefile +0 -103
- data/active_model_serializers.gemspec +0 -66
- data/appveyor.yml +0 -24
- data/bin/bench +0 -171
- data/bin/bench_regression +0 -316
- data/bin/serve_benchmark +0 -39
- data/docs/ARCHITECTURE.md +0 -126
- data/docs/README.md +0 -40
- data/docs/STYLE.md +0 -58
- data/docs/general/adapters.md +0 -245
- data/docs/general/caching.md +0 -52
- data/docs/general/configuration_options.md +0 -100
- data/docs/general/deserialization.md +0 -100
- 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 -14
- data/docs/general/rendering.md +0 -255
- data/docs/general/serializers.md +0 -372
- data/docs/how-open-source-maintained.jpg +0 -0
- data/docs/howto/add_pagination_links.md +0 -139
- data/docs/howto/add_root_key.md +0 -51
- data/docs/howto/outside_controller_use.md +0 -58
- data/docs/howto/passing_arbitrary_options.md +0 -27
- data/docs/howto/serialize_poro.md +0 -32
- data/docs/howto/test.md +0 -152
- data/docs/integrations/ember-and-json-api.md +0 -112
- 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/lib/active_model/serializer/associations.rb +0 -100
- data/lib/active_model/serializer/attributes.rb +0 -82
- data/lib/active_model/serializer/collection_reflection.rb +0 -7
- data/lib/active_model/serializer/configuration.rb +0 -35
- data/lib/active_model/serializer/include_tree.rb +0 -111
- data/lib/active_model/serializer/links.rb +0 -35
- data/lib/active_model/serializer/meta.rb +0 -29
- data/lib/active_model/serializer/singular_reflection.rb +0 -7
- data/lib/active_model/serializer/type.rb +0 -25
- data/lib/active_model_serializers/key_transform.rb +0 -70
- data/test/action_controller/adapter_selector_test.rb +0 -53
- data/test/action_controller/explicit_serializer_test.rb +0 -134
- data/test/action_controller/json/include_test.rb +0 -167
- data/test/action_controller/json_api/deserialization_test.rb +0 -112
- data/test/action_controller/json_api/errors_test.rb +0 -41
- data/test/action_controller/json_api/linked_test.rb +0 -197
- data/test/action_controller/json_api/pagination_test.rb +0 -116
- data/test/action_controller/json_api/transform_test.rb +0 -181
- data/test/action_controller/serialization_scope_name_test.rb +0 -229
- data/test/action_controller/serialization_test.rb +0 -469
- data/test/active_model_serializers/adapter_for_test.rb +0 -208
- data/test/active_model_serializers/json_pointer_test.rb +0 -20
- data/test/active_model_serializers/key_transform_test.rb +0 -263
- data/test/active_model_serializers/logging_test.rb +0 -77
- data/test/active_model_serializers/model_test.rb +0 -9
- data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
- data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -58
- data/test/active_model_serializers/test/schema_test.rb +0 -130
- data/test/active_model_serializers/test/serializer_test.rb +0 -62
- data/test/active_record_test.rb +0 -9
- data/test/adapter/deprecation_test.rb +0 -100
- data/test/adapter/json/belongs_to_test.rb +0 -45
- data/test/adapter/json/collection_test.rb +0 -90
- data/test/adapter/json/has_many_test.rb +0 -45
- data/test/adapter/json/transform_test.rb +0 -93
- data/test/adapter/json_api/belongs_to_test.rb +0 -155
- data/test/adapter/json_api/collection_test.rb +0 -95
- data/test/adapter/json_api/errors_test.rb +0 -78
- data/test/adapter/json_api/fields_test.rb +0 -87
- data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
- data/test/adapter/json_api/has_many_test.rb +0 -144
- data/test/adapter/json_api/has_one_test.rb +0 -80
- data/test/adapter/json_api/json_api_test.rb +0 -35
- data/test/adapter/json_api/linked_test.rb +0 -392
- data/test/adapter/json_api/links_test.rb +0 -93
- data/test/adapter/json_api/pagination_links_test.rb +0 -166
- data/test/adapter/json_api/parse_test.rb +0 -137
- data/test/adapter/json_api/relationship_test.rb +0 -161
- data/test/adapter/json_api/relationships_test.rb +0 -199
- data/test/adapter/json_api/resource_identifier_test.rb +0 -85
- data/test/adapter/json_api/resource_meta_test.rb +0 -100
- data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
- data/test/adapter/json_api/transform_test.rb +0 -502
- data/test/adapter/json_api/type_test.rb +0 -61
- data/test/adapter/json_test.rb +0 -45
- data/test/adapter/null_test.rb +0 -23
- data/test/adapter/polymorphic_test.rb +0 -171
- data/test/adapter_test.rb +0 -67
- data/test/array_serializer_test.rb +0 -22
- data/test/benchmark/app.rb +0 -65
- data/test/benchmark/benchmarking_support.rb +0 -67
- data/test/benchmark/bm_caching.rb +0 -119
- data/test/benchmark/bm_transform.rb +0 -34
- data/test/benchmark/config.ru +0 -3
- data/test/benchmark/controllers.rb +0 -84
- data/test/benchmark/fixtures.rb +0 -219
- data/test/cache_test.rb +0 -485
- data/test/collection_serializer_test.rb +0 -110
- data/test/fixtures/active_record.rb +0 -78
- data/test/fixtures/poro.rb +0 -282
- data/test/generators/scaffold_controller_generator_test.rb +0 -24
- data/test/generators/serializer_generator_test.rb +0 -57
- data/test/grape_test.rb +0 -82
- data/test/include_tree/from_include_args_test.rb +0 -26
- data/test/include_tree/from_string_test.rb +0 -94
- data/test/include_tree/include_args_to_hash_test.rb +0 -64
- data/test/lint_test.rb +0 -49
- data/test/logger_test.rb +0 -18
- data/test/poro_test.rb +0 -9
- data/test/serializable_resource_test.rb +0 -83
- data/test/serializers/association_macros_test.rb +0 -36
- data/test/serializers/associations_test.rb +0 -295
- data/test/serializers/attribute_test.rb +0 -151
- data/test/serializers/attributes_test.rb +0 -52
- data/test/serializers/caching_configuration_test_isolated.rb +0 -170
- data/test/serializers/configuration_test.rb +0 -32
- data/test/serializers/fieldset_test.rb +0 -14
- data/test/serializers/meta_test.rb +0 -196
- data/test/serializers/options_test.rb +0 -21
- data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
- data/test/serializers/root_test.rb +0 -21
- data/test/serializers/serialization_test.rb +0 -55
- data/test/serializers/serializer_for_test.rb +0 -134
- data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
- data/test/support/isolated_unit.rb +0 -79
- data/test/support/rails5_shims.rb +0 -47
- data/test/support/rails_app.rb +0 -45
- 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 -53
- data/test/test_helper.rb +0 -57
|
@@ -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
|
-
'associations' => {
|
|
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.
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Getting Started
|
|
4
|
-
|
|
5
|
-
## Creating a Serializer
|
|
6
|
-
|
|
7
|
-
The easiest way to create a new serializer is to generate a new resource, which
|
|
8
|
-
will generate a serializer at the same time:
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
$ rails g resource post title:string body:string
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
This will generate a serializer in `app/serializers/post_serializer.rb` for
|
|
15
|
-
your new model. You can also generate a serializer for an existing model with
|
|
16
|
-
the serializer generator:
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
$ rails g serializer post
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
The generated serializer will contain basic `attributes` and
|
|
23
|
-
`has_many`/`has_one`/`belongs_to` declarations, based on the model. For example:
|
|
24
|
-
|
|
25
|
-
```ruby
|
|
26
|
-
class PostSerializer < ActiveModel::Serializer
|
|
27
|
-
attributes :title, :body
|
|
28
|
-
|
|
29
|
-
has_many :comments
|
|
30
|
-
has_one :author
|
|
31
|
-
end
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
and
|
|
35
|
-
|
|
36
|
-
```ruby
|
|
37
|
-
class CommentSerializer < ActiveModel::Serializer
|
|
38
|
-
attributes :name, :body
|
|
39
|
-
|
|
40
|
-
belongs_to :post_id
|
|
41
|
-
end
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
The attribute names are a **whitelist** of attributes to be serialized.
|
|
45
|
-
|
|
46
|
-
The `has_many`, `has_one`, and `belongs_to` declarations describe relationships between
|
|
47
|
-
resources. By default, when you serialize a `Post`, you will get its `Comments`
|
|
48
|
-
as well.
|
|
49
|
-
|
|
50
|
-
For more information, see [Serializers](/docs/general/serializers.md).
|
|
51
|
-
|
|
52
|
-
### Namespaced Models
|
|
53
|
-
|
|
54
|
-
When serializing a model inside a namespace, such as `Api::V1::Post`, ActiveModelSerializers will expect the corresponding serializer to be inside the same namespace (namely `Api::V1::PostSerializer`).
|
|
55
|
-
|
|
56
|
-
### Model Associations and Nested Serializers
|
|
57
|
-
|
|
58
|
-
When declaring a serializer for a model with associations, such as:
|
|
59
|
-
```ruby
|
|
60
|
-
class PostSerializer < ActiveModel::Serializer
|
|
61
|
-
has_many :comments
|
|
62
|
-
end
|
|
63
|
-
```
|
|
64
|
-
ActiveModelSerializers will look for `PostSerializer::CommentSerializer` in priority, and fall back to `::CommentSerializer` in case the former does not exist. This allows for more control over the way a model gets serialized as an association of an other model.
|
|
65
|
-
|
|
66
|
-
For example, in the following situation:
|
|
67
|
-
|
|
68
|
-
```ruby
|
|
69
|
-
class CommentSerializer < ActiveModel::Serializer
|
|
70
|
-
attributes :body, :date, :nb_likes
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
class PostSerializer < ActiveModel::Serializer
|
|
74
|
-
has_many :comments
|
|
75
|
-
class CommentSerializer < ActiveModel::Serializer
|
|
76
|
-
attributes :body_short
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
ActiveModelSerializers will use `PostSerializer::CommentSerializer` (thus including only the `:body_short` attribute) when serializing a `Comment` as part of a `Post`, but use `::CommentSerializer` when serializing a `Comment` directly (thus including `:body, :date, :nb_likes`).
|
|
82
|
-
|
|
83
|
-
### Extending a Base `ApplicationSerializer`
|
|
84
|
-
|
|
85
|
-
By default, new serializers descend from `ActiveModel::Serializer`. However, if
|
|
86
|
-
you wish to share behavior across your serializers, you can create an
|
|
87
|
-
`ApplicationSerializer` at `app/serializers/application_serializer.rb`:
|
|
88
|
-
|
|
89
|
-
```ruby
|
|
90
|
-
class ApplicationSerializer < ActiveModel::Serializer
|
|
91
|
-
end
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Then any newly-generated serializers will automatically descend from
|
|
95
|
-
`ApplicationSerializer`.
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
$ rails g serializer post
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Now generates:
|
|
102
|
-
|
|
103
|
-
```ruby
|
|
104
|
-
class PostSerializer < ApplicationSerializer
|
|
105
|
-
attributes :id
|
|
106
|
-
end
|
|
107
|
-
````
|
|
108
|
-
|
|
109
|
-
## Rails Integration
|
|
110
|
-
|
|
111
|
-
ActiveModelSerializers will automatically integrate with your Rails app,
|
|
112
|
-
so you won't need to update your controller.
|
|
113
|
-
This is a example of how the controller will look:
|
|
114
|
-
|
|
115
|
-
```ruby
|
|
116
|
-
class PostsController < ApplicationController
|
|
117
|
-
|
|
118
|
-
def show
|
|
119
|
-
@post = Post.find(params[:id])
|
|
120
|
-
render json: @post
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
end
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
If you wish to use Rails url helpers for link generation, e.g., `link(:resources) { resources_url }`, ensure your application sets
|
|
127
|
-
`Rails.application.routes.default_url_options`.
|
|
128
|
-
|
|
129
|
-
```ruby
|
|
130
|
-
Rails.application.routes.default_url_options = {
|
|
131
|
-
host: 'example.com'
|
|
132
|
-
}
|
|
133
|
-
```
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Instrumentation
|
|
4
|
-
|
|
5
|
-
ActiveModelSerializers uses the
|
|
6
|
-
[ActiveSupport::Notification API](http://guides.rubyonrails.org/active_support_instrumentation.html#subscribing-to-an-event),
|
|
7
|
-
which allows for subscribing to events, such as for logging.
|
|
8
|
-
|
|
9
|
-
## Events
|
|
10
|
-
|
|
11
|
-
Name:
|
|
12
|
-
|
|
13
|
-
`render.active_model_serializers`
|
|
14
|
-
|
|
15
|
-
Payload (example):
|
|
16
|
-
|
|
17
|
-
```ruby
|
|
18
|
-
{
|
|
19
|
-
serializer: PostSerializer,
|
|
20
|
-
adapter: ActiveModelSerializers::Adapter::Attributes
|
|
21
|
-
}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Subscribing:
|
|
25
|
-
|
|
26
|
-
```ruby
|
|
27
|
-
ActiveSupport::Notifications.subscribe 'render.active_model_serializers' do |name, started, finished, unique_id, data|
|
|
28
|
-
# whatever
|
|
29
|
-
end
|
|
30
|
-
ActiveSupport::Notifications.subscribe 'render.active_model_serializers' do |*args|
|
|
31
|
-
event = ActiveSupport::Notifications::Event.new(*args)
|
|
32
|
-
# event.payload
|
|
33
|
-
# whatever
|
|
34
|
-
end
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## [LogSubscriber](http://api.rubyonrails.org/classes/ActiveSupport/LogSubscriber.html)
|
|
38
|
-
|
|
39
|
-
ActiveModelSerializers includes an `ActiveModelSerializers::LogSubscriber` that attaches to
|
|
40
|
-
`render.active_model_serializers`.
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Key Transforms
|
|
4
|
-
|
|
5
|
-
Key Transforms modify the casing of keys and keys referenced in values in
|
|
6
|
-
serialized responses.
|
|
7
|
-
|
|
8
|
-
Provided key transforms:
|
|
9
|
-
|
|
10
|
-
| Option | Result |
|
|
11
|
-
|----|----|
|
|
12
|
-
| `:camel` | ExampleKey |
|
|
13
|
-
| `:camel_lower` | exampleKey |
|
|
14
|
-
| `:dash` | example-key |
|
|
15
|
-
| `:unaltered` | the original, unaltered key |
|
|
16
|
-
| `:underscore` | example_key |
|
|
17
|
-
| `nil` | use the adapter default |
|
|
18
|
-
|
|
19
|
-
Key translation precedence is as follows:
|
|
20
|
-
|
|
21
|
-
##### Adapter option
|
|
22
|
-
|
|
23
|
-
`key_transform` is provided as an option via render.
|
|
24
|
-
|
|
25
|
-
```render json: posts, each_serializer: PostSerializer, key_transform: :camel_lower```
|
|
26
|
-
|
|
27
|
-
##### Configuration option
|
|
28
|
-
|
|
29
|
-
`key_transform` is set in `ActiveModelSerializers.config.key_transform`.
|
|
30
|
-
|
|
31
|
-
```ActiveModelSerializers.config.key_transform = :camel_lower```
|
|
32
|
-
|
|
33
|
-
##### Adapter default
|
|
34
|
-
|
|
35
|
-
Each adapter has a default transform configured:
|
|
36
|
-
|
|
37
|
-
| Adapter | Default Key Transform |
|
|
38
|
-
|----|----|
|
|
39
|
-
| `Json` | `:unaltered` |
|
|
40
|
-
| `JsonApi` | `:dash` |
|
data/docs/general/logging.md
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Logging
|
|
4
|
-
|
|
5
|
-
The default logger in a Rails application will be `Rails.logger`.
|
|
6
|
-
|
|
7
|
-
When there is no `Rails.logger`, the default logger is an instance of
|
|
8
|
-
`ActiveSupport::TaggedLogging` logging to STDOUT.
|
|
9
|
-
|
|
10
|
-
You may customize the logger in an initializer, for example:
|
|
11
|
-
|
|
12
|
-
```ruby
|
|
13
|
-
ActiveModelSerializers.logger = Logger.new(STDOUT)
|
|
14
|
-
```
|
data/docs/general/rendering.md
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
[Back to Guides](../README.md)
|
|
2
|
-
|
|
3
|
-
# Rendering
|
|
4
|
-
|
|
5
|
-
### Implicit Serializer
|
|
6
|
-
|
|
7
|
-
In your controllers, when you use `render :json`, Rails will now first search
|
|
8
|
-
for a serializer for the object and use it if available.
|
|
9
|
-
|
|
10
|
-
```ruby
|
|
11
|
-
class PostsController < ApplicationController
|
|
12
|
-
def show
|
|
13
|
-
@post = Post.find(params[:id])
|
|
14
|
-
|
|
15
|
-
render json: @post
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
In this case, Rails will look for a serializer named `PostSerializer`, and if
|
|
21
|
-
it exists, use it to serialize the `Post`.
|
|
22
|
-
|
|
23
|
-
### Explicit Serializer
|
|
24
|
-
|
|
25
|
-
If you wish to use a serializer other than the default, you can explicitly pass it to the renderer.
|
|
26
|
-
|
|
27
|
-
#### 1. For a resource:
|
|
28
|
-
|
|
29
|
-
```ruby
|
|
30
|
-
render json: @post, serializer: PostPreviewSerializer
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
#### 2. For a resource collection:
|
|
34
|
-
|
|
35
|
-
Specify the serializer for each resource with `each_serializer`
|
|
36
|
-
|
|
37
|
-
```ruby
|
|
38
|
-
render json: @posts, each_serializer: PostPreviewSerializer
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
The default serializer for collections is `CollectionSerializer`.
|
|
42
|
-
|
|
43
|
-
Specify the collection serializer with the `serializer` option.
|
|
44
|
-
|
|
45
|
-
```ruby
|
|
46
|
-
render json: @posts, serializer: CollectionSerializer, each_serializer: PostPreviewSerializer
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Serializing non-ActiveRecord objects
|
|
50
|
-
|
|
51
|
-
All serializable resources must pass the
|
|
52
|
-
[ActiveModel::Serializer::Lint::Tests](../../lib/active_model/serializer/lint.rb#L17).
|
|
53
|
-
|
|
54
|
-
See the ActiveModelSerializers::Model for a base class that implements the full
|
|
55
|
-
API for a plain-old Ruby object (PORO).
|
|
56
|
-
|
|
57
|
-
## SerializableResource options
|
|
58
|
-
|
|
59
|
-
The `options` hash passed to `render` or `ActiveModelSerializers::SerializableResource.new(resource, options)`
|
|
60
|
-
are partitioned into `serializer_opts` and `adapter_opts`. `adapter_opts` are passed to new Adapters;
|
|
61
|
-
`serializer_opts` are passed to new Serializers.
|
|
62
|
-
|
|
63
|
-
The `adapter_opts` are specified in [ActiveModelSerializers::SerializableResource::ADAPTER_OPTIONS](../../lib/active_model_serializers/serializable_resource.rb#L5).
|
|
64
|
-
The `serializer_opts` are the remaining options.
|
|
65
|
-
|
|
66
|
-
(In Rails, the `options` are also passed to the `as_json(options)` or `to_json(options)`
|
|
67
|
-
methods on the resource serialization by the Rails JSON renderer. They are, therefore, important
|
|
68
|
-
to know about, but not part of ActiveModelSerializers.)
|
|
69
|
-
|
|
70
|
-
See [ARCHITECTURE](../ARCHITECTURE.md) for more information.
|
|
71
|
-
|
|
72
|
-
### adapter_opts
|
|
73
|
-
|
|
74
|
-
#### fields
|
|
75
|
-
|
|
76
|
-
PR please :)
|
|
77
|
-
|
|
78
|
-
#### adapter
|
|
79
|
-
|
|
80
|
-
PR please :)
|
|
81
|
-
|
|
82
|
-
#### key_transform
|
|
83
|
-
|
|
84
|
-
```render json: posts, each_serializer: PostSerializer, key_transform: :camel_lower```
|
|
85
|
-
|
|
86
|
-
See [Key Transforms](key_transforms.md) for more informaiton.
|
|
87
|
-
|
|
88
|
-
#### meta
|
|
89
|
-
|
|
90
|
-
A `meta` member can be used to include non-standard meta-information. `meta` can
|
|
91
|
-
be utilized in several levels in a response.
|
|
92
|
-
|
|
93
|
-
##### Top-level
|
|
94
|
-
|
|
95
|
-
To set top-level `meta` in a response, specify it in the `render` call.
|
|
96
|
-
|
|
97
|
-
```ruby
|
|
98
|
-
render json: @post, meta: { total: 10 }
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
The key can be customized using `meta_key` option.
|
|
102
|
-
|
|
103
|
-
```ruby
|
|
104
|
-
render json: @post, meta: { total: 10 }, meta_key: "custom_meta"
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
`meta` will only be included in your response if you are using an Adapter that
|
|
108
|
-
supports `root`, e.g., `JsonApi` and `Json` adapters. The default adapter,
|
|
109
|
-
`Attributes` does not have `root`.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
##### Resource-level
|
|
113
|
-
|
|
114
|
-
To set resource-level `meta` in a response, define meta in a serializer with one
|
|
115
|
-
of the following methods:
|
|
116
|
-
|
|
117
|
-
As a single, static string.
|
|
118
|
-
|
|
119
|
-
```ruby
|
|
120
|
-
meta stuff: 'value'
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
As a block containing a Hash.
|
|
124
|
-
|
|
125
|
-
```ruby
|
|
126
|
-
meta do
|
|
127
|
-
{
|
|
128
|
-
rating: 4,
|
|
129
|
-
comments_count: object.comments.count
|
|
130
|
-
}
|
|
131
|
-
end
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
#### links
|
|
136
|
-
|
|
137
|
-
If you wish to use Rails url helpers for link generation, e.g., `link(:resources) { resources_url }`, ensure your application sets
|
|
138
|
-
`Rails.application.routes.default_url_options`.
|
|
139
|
-
|
|
140
|
-
##### Top-level
|
|
141
|
-
|
|
142
|
-
JsonApi supports a [links object](http://jsonapi.org/format/#document-links) to be specified at top-level, that you can specify in the `render`:
|
|
143
|
-
|
|
144
|
-
```ruby
|
|
145
|
-
links_object = {
|
|
146
|
-
href: "http://example.com/api/posts",
|
|
147
|
-
meta: {
|
|
148
|
-
count: 10
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
render json: @posts, links: links_object
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
That's the result:
|
|
155
|
-
|
|
156
|
-
```json
|
|
157
|
-
{
|
|
158
|
-
"data": [
|
|
159
|
-
{
|
|
160
|
-
"type": "posts",
|
|
161
|
-
"id": "1",
|
|
162
|
-
"attributes": {
|
|
163
|
-
"title": "JSON API is awesome!",
|
|
164
|
-
"body": "You should be using JSON API",
|
|
165
|
-
"created": "2015-05-22T14:56:29.000Z",
|
|
166
|
-
"updated": "2015-05-22T14:56:28.000Z"
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
],
|
|
170
|
-
"links": {
|
|
171
|
-
"href": "http://example.com/api/posts",
|
|
172
|
-
"meta": {
|
|
173
|
-
"count": 10
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
This feature is specific to JsonApi, so you have to use the use the [JsonApi Adapter](adapters.md#jsonapi)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
##### Resource-level
|
|
183
|
-
|
|
184
|
-
In your serializer, define each link in one of the following methods:
|
|
185
|
-
|
|
186
|
-
As a static string
|
|
187
|
-
|
|
188
|
-
```ruby
|
|
189
|
-
link :link_name, 'https://example.com/resource'
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
As a block to be evaluated. When using Rails, URL helpers are available.
|
|
193
|
-
Ensure your application sets `Rails.application.routes.default_url_options`.
|
|
194
|
-
|
|
195
|
-
```ruby
|
|
196
|
-
link :link_name_ do
|
|
197
|
-
"https://example.com/resource/#{object.id}"
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
link(:link_name) { "https://example.com/resource/#{object.id}" }
|
|
201
|
-
|
|
202
|
-
link(:link_name) { resource_url(object) }
|
|
203
|
-
|
|
204
|
-
link(:link_name) { url_for(controller: 'controller_name', action: 'index', only_path: false) }
|
|
205
|
-
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### serializer_opts
|
|
209
|
-
|
|
210
|
-
#### include
|
|
211
|
-
|
|
212
|
-
PR please :)
|
|
213
|
-
|
|
214
|
-
#### Overriding the root key
|
|
215
|
-
|
|
216
|
-
Overriding the resource root only applies when using the JSON adapter.
|
|
217
|
-
|
|
218
|
-
Normally, the resource root is derived from the class name of the resource being serialized.
|
|
219
|
-
e.g. `UserPostSerializer.new(UserPost.new)` will be serialized with the root `user_post` or `user_posts` according the adapter collection pluralization rules.
|
|
220
|
-
|
|
221
|
-
When using the JSON adapter in your initializer (ActiveModelSerializers.config.adapter = :json), or passing in the adapter in your render call, you can specify the root by passing it as an argument to `render`. For example:
|
|
222
|
-
|
|
223
|
-
```ruby
|
|
224
|
-
render json: @user_post, root: "admin_post", adapter: :json
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
This will be rendered as:
|
|
228
|
-
```json
|
|
229
|
-
{
|
|
230
|
-
"admin_post": {
|
|
231
|
-
"title": "how to do open source"
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
```
|
|
235
|
-
Note: the `Attributes` adapter (default) does not include a resource root. You also will not be able to create a single top-level root if you are using the :json_api adapter.
|
|
236
|
-
|
|
237
|
-
#### serializer
|
|
238
|
-
|
|
239
|
-
PR please :)
|
|
240
|
-
|
|
241
|
-
#### scope
|
|
242
|
-
|
|
243
|
-
PR please :)
|
|
244
|
-
|
|
245
|
-
#### scope_name
|
|
246
|
-
|
|
247
|
-
PR please :)
|
|
248
|
-
|
|
249
|
-
## Using a serializer without `render`
|
|
250
|
-
|
|
251
|
-
See [Usage outside of a controller](../howto/outside_controller_use.md#serializing-before-controller-render).
|
|
252
|
-
|
|
253
|
-
## Pagination
|
|
254
|
-
|
|
255
|
-
See [How to add pagination links](https://github.com/rails-api/active_model_serializers/blob/master/docs/howto/add_pagination_links.md).
|