active_model_serializers 0.10.0 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -4
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +39 -2
  5. data/Gemfile +1 -1
  6. data/README.md +21 -24
  7. data/Rakefile +3 -3
  8. data/active_model_serializers.gemspec +19 -23
  9. data/docs/general/adapters.md +4 -2
  10. data/docs/general/configuration_options.md +6 -1
  11. data/docs/general/deserialization.md +1 -1
  12. data/docs/general/fields.md +31 -0
  13. data/docs/general/rendering.md +7 -2
  14. data/docs/general/serializers.md +62 -3
  15. data/docs/howto/add_pagination_links.md +2 -3
  16. data/docs/integrations/ember-and-json-api.md +25 -10
  17. data/docs/jsonapi/schema.md +1 -1
  18. data/lib/action_controller/serialization.rb +4 -3
  19. data/lib/active_model/serializer/adapter/base.rb +2 -0
  20. data/lib/active_model/serializer/array_serializer.rb +8 -5
  21. data/lib/active_model/serializer/associations.rb +6 -7
  22. data/lib/active_model/serializer/belongs_to_reflection.rb +0 -3
  23. data/lib/active_model/serializer/caching.rb +67 -112
  24. data/lib/active_model/serializer/collection_serializer.rb +30 -10
  25. data/lib/active_model/serializer/configuration.rb +1 -0
  26. data/lib/active_model/serializer/error_serializer.rb +11 -7
  27. data/lib/active_model/serializer/errors_serializer.rb +25 -20
  28. data/lib/active_model/serializer/has_many_reflection.rb +0 -3
  29. data/lib/active_model/serializer/has_one_reflection.rb +0 -3
  30. data/lib/active_model/serializer/lint.rb +134 -130
  31. data/lib/active_model/serializer/reflection.rb +3 -3
  32. data/lib/active_model/serializer/version.rb +1 -1
  33. data/lib/active_model/serializer.rb +57 -15
  34. data/lib/active_model_serializers/adapter/attributes.rb +2 -67
  35. data/lib/active_model_serializers/adapter/base.rb +38 -38
  36. data/lib/active_model_serializers/adapter/json_api/link.rb +1 -1
  37. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +8 -1
  38. data/lib/active_model_serializers/adapter/json_api.rb +36 -28
  39. data/lib/active_model_serializers/adapter.rb +6 -0
  40. data/lib/active_model_serializers/deprecate.rb +1 -2
  41. data/lib/active_model_serializers/deserialization.rb +2 -0
  42. data/lib/active_model_serializers/model.rb +3 -1
  43. data/lib/active_model_serializers/railtie.rb +3 -1
  44. data/lib/active_model_serializers/register_jsonapi_renderer.rb +44 -31
  45. data/lib/active_model_serializers/serialization_context.rb +10 -3
  46. data/lib/active_model_serializers.rb +6 -0
  47. data/lib/generators/rails/serializer_generator.rb +3 -3
  48. data/lib/grape/active_model_serializers.rb +7 -5
  49. data/lib/grape/formatters/active_model_serializers.rb +19 -2
  50. data/lib/grape/helpers/active_model_serializers.rb +1 -0
  51. data/test/action_controller/adapter_selector_test.rb +4 -4
  52. data/test/action_controller/explicit_serializer_test.rb +5 -4
  53. data/test/action_controller/json/include_test.rb +106 -27
  54. data/test/action_controller/json_api/errors_test.rb +6 -7
  55. data/test/action_controller/json_api/linked_test.rb +29 -24
  56. data/test/action_controller/json_api/pagination_test.rb +19 -19
  57. data/test/action_controller/serialization_test.rb +10 -7
  58. data/test/active_model_serializers/json_pointer_test.rb +15 -13
  59. data/test/active_model_serializers/key_transform_test.rb +254 -252
  60. data/test/active_model_serializers/model_test.rb +6 -4
  61. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +143 -0
  62. data/test/active_model_serializers/serialization_context_test_isolated.rb +23 -10
  63. data/test/adapter/json/collection_test.rb +14 -0
  64. data/test/adapter/json/transform_test.rb +14 -14
  65. data/test/adapter/json_api/collection_test.rb +4 -3
  66. data/test/adapter/json_api/errors_test.rb +17 -19
  67. data/test/adapter/json_api/has_many_test.rb +18 -18
  68. data/test/adapter/json_api/json_api_test.rb +5 -7
  69. data/test/adapter/json_api/linked_test.rb +9 -6
  70. data/test/adapter/json_api/links_test.rb +3 -1
  71. data/test/adapter/json_api/pagination_links_test.rb +19 -7
  72. data/test/adapter/json_api/relationships_test.rb +9 -4
  73. data/test/adapter/json_api/resource_identifier_test.rb +7 -2
  74. data/test/adapter/json_api/resource_meta_test.rb +3 -3
  75. data/test/adapter/json_api/transform_test.rb +251 -250
  76. data/test/adapter/json_api/type_test.rb +1 -1
  77. data/test/adapter/json_test.rb +8 -7
  78. data/test/adapter/null_test.rb +1 -2
  79. data/test/adapter/polymorphic_test.rb +5 -5
  80. data/test/adapter_test.rb +1 -1
  81. data/test/benchmark/app.rb +1 -1
  82. data/test/benchmark/bm_caching.rb +15 -15
  83. data/test/benchmark/bm_transform.rb +16 -5
  84. data/test/benchmark/controllers.rb +16 -17
  85. data/test/benchmark/fixtures.rb +72 -72
  86. data/test/cache_test.rb +101 -45
  87. data/test/collection_serializer_test.rb +2 -2
  88. data/test/fixtures/poro.rb +8 -7
  89. data/test/grape_test.rb +152 -56
  90. data/test/lint_test.rb +1 -1
  91. data/test/logger_test.rb +13 -11
  92. data/test/serializable_resource_test.rb +18 -22
  93. data/test/serializers/associations_test.rb +10 -10
  94. data/test/serializers/attribute_test.rb +1 -1
  95. data/test/serializers/attributes_test.rb +1 -1
  96. data/test/serializers/fieldset_test.rb +1 -1
  97. data/test/serializers/meta_test.rb +12 -6
  98. data/test/serializers/root_test.rb +1 -1
  99. data/test/serializers/serializer_for_test.rb +3 -1
  100. data/test/support/isolated_unit.rb +5 -2
  101. data/test/support/rails5_shims.rb +8 -2
  102. data/test/support/rails_app.rb +0 -9
  103. data/test/support/serialization_testing.rb +7 -5
  104. metadata +54 -24
  105. data/.rubocop_todo.yml +0 -167
  106. data/lib/active_model/serializer/include_tree.rb +0 -111
  107. data/test/include_tree/from_include_args_test.rb +0 -26
  108. data/test/include_tree/from_string_test.rb +0 -94
  109. data/test/include_tree/include_args_to_hash_test.rb +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb97c8740c2530c085ee9186ea27ddd220367fc3
4
- data.tar.gz: 0a768d3ab122abe2c3e7f5b6c00a8dada6872433
3
+ metadata.gz: d9ab72fd33fbf20e8630b9109d18edda9272658e
4
+ data.tar.gz: 8654e40594d8bf26038b329a8044dc9197bc5733
5
5
  SHA512:
6
- metadata.gz: 5589022dd6fa160c0a03981cedf46433fb1eb19e4bac5f3489908671e9e0969c48bb7a86cf03d12cf8ce825b2efe3ed6ad1b6594019635470319c899e7964617
7
- data.tar.gz: 989cf413780f12d47a553a7aae5cba33de1625bbc022366b7e4533810b87b151302ed6000116c03234bf2b2048a913048624728a54be87cead848076924cf6ce
6
+ metadata.gz: 454504b650ab8302e6e1f87b15f952ff3068033bcaaac136764211fbcb724759b354d66b7e0b662e1e10a1b57734173b4843f96eb2344c164d568fae824da8b3
7
+ data.tar.gz: 56355761907c1ea7882d7b04dc8adcff8538f188bd418946c2493a267188cedfef4247e410206b4c479575ba926efa1259c5966e166b901eaea26c45b7d4aae8
data/.rubocop.yml CHANGED
@@ -1,7 +1,5 @@
1
- inherit_from: .rubocop_todo.yml
2
-
3
1
  AllCops:
4
- TargetRubyVersion: 2.2
2
+ TargetRubyVersion: 2.1
5
3
  Exclude:
6
4
  - config/initializers/forbidden_yaml.rb
7
5
  - !ruby/regexp /(vendor|bundle|bin|db|tmp)\/.*/
@@ -46,7 +44,7 @@ Style/AlignParameters:
46
44
  EnforcedStyle: with_fixed_indentation
47
45
 
48
46
  Style/ClassAndModuleChildren:
49
- EnforcedStyle: compact
47
+ EnforcedStyle: nested
50
48
 
51
49
  Style/Documentation:
52
50
  Enabled: false
data/.travis.yml CHANGED
@@ -27,6 +27,7 @@ env:
27
27
  matrix:
28
28
  - "RAILS_VERSION=4.1"
29
29
  - "RAILS_VERSION=4.2"
30
+ - "RAILS_VERSION=5.0"
30
31
  - "RAILS_VERSION=master"
31
32
 
32
33
  matrix:
data/CHANGELOG.md CHANGED
@@ -1,8 +1,44 @@
1
1
  ## 0.10.x
2
2
 
3
- ### [master (unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0...master)
3
+ ### [master (unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.2...master)
4
4
 
5
- ### v0.10.0 (2016-05-17)
5
+ Breaking changes:
6
+
7
+ Features:
8
+
9
+ Fixes:
10
+
11
+ Misc:
12
+
13
+ ### [v0.10.2 (2016-07-05)(unreleased)](https://github.com/rails-api/active_model_serializers/compare/v0.10.1...v0.10.2)
14
+
15
+ Fixes:
16
+ - [#1814] (https://github.com/rails-api/active_model_serializers/pull/1814) Ensuring read_multi works with fragment cache
17
+
18
+ Misc:
19
+ - [#1808](https://github.com/rails-api/active_model_serializers/pull/1808) Adds documentation for `fields` option. (@luizkowalski)
20
+
21
+ ### [v0.10.1 (2016-06-16)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0...v0.10.1)
22
+
23
+ Features:
24
+ - [#1668](https://github.com/rails-api/active_model_serializers/pull/1668) Exclude nil and empty links. (@sigmike)
25
+ - [#1426](https://github.com/rails-api/active_model_serializers/pull/1426) Add ActiveModelSerializers.config.default_includes (@empact)
26
+
27
+ Fixes:
28
+ - [#1754](https://github.com/rails-api/active_model_serializers/pull/1754) Fixes #1759, Grape integration, improves serialization_context
29
+ missing error message on pagination. Document overriding CollectionSerializer#paginated?. (@bf4)
30
+ Moved serialization_context creation to Grape formatter, so resource serialization works without explicit calls to the `render` helper method.
31
+ Added Grape collection tests. (@onomated)
32
+ - [#1287](https://github.com/rails-api/active_model_serializers/pull/1287) Pass `fields` options from adapter to serializer. (@vasilakisfil)
33
+ - [#1710](https://github.com/rails-api/active_model_serializers/pull/1710) Prevent association loading when `include_data` option
34
+ is set to `false`. (@groyoh)
35
+ - [#1747](https://github.com/rails-api/active_model_serializers/pull/1747) Improve jsonapi mime type registration for Rails 5 (@remear)
36
+
37
+ Misc:
38
+ - [#1734](https://github.com/rails-api/active_model_serializers/pull/1734) Adds documentation for conditional attribute (@lambda2)
39
+ - [#1685](https://github.com/rails-api/active_model_serializers/pull/1685) Replace `IncludeTree` with `IncludeDirective` from the jsonapi gem.
40
+
41
+ ### [v0.10.0 (2016-05-17)](https://github.com/rails-api/active_model_serializers/compare/4a2d9853ba7...v0.10.0)
6
42
 
7
43
  Breaking changes:
8
44
  - [#1662](https://github.com/rails-api/active_model_serializers/pull/1662) Drop support for Rails 4.0 and Ruby 2.0.0. (@remear)
@@ -22,6 +58,7 @@ Fixes:
22
58
 
23
59
  Misc:
24
60
  - [#1673](https://github.com/rails-api/active_model_serializers/pull/1673) Adds "How to" guide on using AMS with POROs (@DrSayre)
61
+ - [#1730](https://github.com/rails-api/active_model_serializers/pull/1730) Adds documentation for overriding default serializer based on conditions (@groyoh/@cgmckeever)
25
62
 
26
63
  ### [v0.10.0.rc5 (2016-04-04)](https://github.com/rails-api/active_model_serializers/compare/v0.10.0.rc4...v0.10.0.rc5)
27
64
 
data/Gemfile CHANGED
@@ -48,6 +48,6 @@ group :test do
48
48
  end
49
49
 
50
50
  group :development, :test do
51
- gem 'rubocop', '~> 0.39.0', require: false
51
+ gem 'rubocop', '~> 0.40.0', require: false
52
52
  gem 'yard', require: false
53
53
  end
data/README.md CHANGED
@@ -24,17 +24,6 @@
24
24
  </tr>
25
25
  </table>
26
26
 
27
-
28
- ## Documentation
29
-
30
- - [0.10 (master) Documentation](https://github.com/rails-api/active_model_serializers/tree/master)
31
- - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/v0.10.0)
32
- - [Guides](docs)
33
- - [0.9 (0-9-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
34
- - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-9-stable)
35
- - [0.8 (0-8-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-8-stable)
36
- - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-8-stable)
37
-
38
27
  ## About
39
28
 
40
29
  ActiveModelSerializers brings convention over configuration to your JSON generation.
@@ -50,33 +39,24 @@ resource serialization. The serialization has the `#as_json`, `#to_json` and `#s
50
39
  methods used by the Rails JSON Renderer. (SerializableResource actually delegates
51
40
  these methods to the adapter.)
52
41
 
53
- By default ActiveModelSerializers will use the **Attributes Adapter**.
42
+ By default ActiveModelSerializers will use the **Attributes Adapter** (no JSON root).
54
43
  But we strongly advise you to use **JsonApi Adapter**, which
55
44
  follows 1.0 of the format specified in [jsonapi.org/format](http://jsonapi.org/format).
56
45
  Check how to change the adapter in the sections below.
57
46
 
58
- ## RELEASE CANDIDATE, PLEASE READ
59
-
60
- This is the **master** branch of ActiveModelSerializers.
61
-
62
- It will become the `0.10.0` release when it's ready. Currently this is a release candidate.
63
-
64
47
  `0.10.x` is **not** backward compatible with `0.9.x` nor `0.8.x`.
65
48
 
66
- `0.10.x` will be based on the `0.8.0` code, but with a more flexible
49
+ `0.10.x` is based on the `0.8.0` code, but with a more flexible
67
50
  architecture. We'd love your help. [Learn how you can help here.](CONTRIBUTING.md)
68
51
 
69
52
  It is generally safe and recommended to use the master branch.
70
53
 
71
- For more information, see the post '[The future of
72
- AMS](https://medium.com/@joaomdmoura/the-future-of-ams-e5f9047ca7e9)'.
73
-
74
54
  ## Installation
75
55
 
76
56
  Add this line to your application's Gemfile:
77
57
 
78
58
  ```
79
- gem 'active_model_serializers'
59
+ gem 'active_model_serializers', '~> 0.10.0'
80
60
  ```
81
61
 
82
62
  And then execute:
@@ -103,8 +83,25 @@ If you'd like to chat, we have a [community slack](http://amserializers.herokuap
103
83
 
104
84
  Thanks!
105
85
 
86
+ ## Documentation
87
+
88
+ - [0.10 (master) Documentation](https://github.com/rails-api/active_model_serializers/tree/master)
89
+ - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/v0.10.0)
90
+ - [Guides](docs)
91
+ - [0.9 (0-9-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-9-stable)
92
+ - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-9-stable)
93
+ - [0.8 (0-8-stable) Documentation](https://github.com/rails-api/active_model_serializers/tree/0-8-stable)
94
+ - [![API Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/rails-api/active_model_serializers/0-8-stable)
95
+
96
+
106
97
  ## High-level behavior
107
98
 
99
+ Choose an adapter from [adapters](lib/active_model_serializers/adapter):
100
+
101
+ ``` ruby
102
+ ActiveModelSerializers.config.adapter = :json_api # Default: `:attributes`
103
+ ```
104
+
108
105
  Given a [serializable model](lib/active_model/serializer/lint.rb):
109
106
 
110
107
  ```ruby
@@ -162,6 +159,6 @@ serializer.associations
162
159
  ```
163
160
  See [ARCHITECTURE.md](docs/ARCHITECTURE.md) for more information.
164
161
 
165
- # Contributing
162
+ ## Contributing
166
163
 
167
164
  See [CONTRIBUTING.md](CONTRIBUTING.md)
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ rescue LoadError
5
5
  end
6
6
  begin
7
7
  require 'simplecov'
8
- rescue LoadError
8
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
9
9
  end
10
10
 
11
11
  Bundler::GemHelper.install_tasks
@@ -33,7 +33,7 @@ end
33
33
  begin
34
34
  require 'rubocop'
35
35
  require 'rubocop/rake_task'
36
- rescue LoadError
36
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
37
37
  else
38
38
  Rake::Task[:rubocop].clear if Rake::Task.task_defined?(:rubocop)
39
39
  require 'rbconfig'
@@ -100,4 +100,4 @@ else
100
100
  end
101
101
 
102
102
  desc 'CI test task'
103
- task :ci => [:default]
103
+ task ci: [:default]
@@ -19,33 +19,35 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
  spec.executables = []
21
21
 
22
- spec.required_ruby_version = '>= 2.0.0'
22
+ spec.required_ruby_version = '>= 2.1'
23
23
 
24
- rails_versions = '>= 4.0'
24
+ rails_versions = ['>= 4.1', '< 6']
25
25
  spec.add_runtime_dependency 'activemodel', rails_versions
26
- # 'activesupport', rails_versions
27
- # 'builder'
26
+ # 'activesupport', rails_versions
27
+ # 'builder'
28
28
 
29
29
  spec.add_runtime_dependency 'actionpack', rails_versions
30
- # 'activesupport', rails_versions
31
- # 'rack'
32
- # 'rack-test', '~> 0.6.2'
30
+ # 'activesupport', rails_versions
31
+ # 'rack'
32
+ # 'rack-test', '~> 0.6.2'
33
33
 
34
34
  spec.add_runtime_dependency 'railties', rails_versions
35
- # 'activesupport', rails_versions
36
- # 'actionpack', rails_versions
37
- # 'rake', '>= 0.8.7'
35
+ # 'activesupport', rails_versions
36
+ # 'actionpack', rails_versions
37
+ # 'rake', '>= 0.8.7'
38
38
 
39
39
  # 'activesupport', rails_versions
40
- # 'i18n,
41
- # 'tzinfo'
42
- # 'minitest'
43
- # 'thread_safe'
40
+ # 'i18n,
41
+ # 'tzinfo'
42
+ # 'minitest'
43
+ # 'thread_safe'
44
+
45
+ spec.add_runtime_dependency 'jsonapi', '~> 0.1.1.beta2'
44
46
 
45
47
  spec.add_development_dependency 'activerecord', rails_versions
46
- # arel
47
- # activesupport
48
- # activemodel
48
+ # arel
49
+ # activesupport
50
+ # activemodel
49
51
 
50
52
  # Soft dependency for pagination
51
53
  spec.add_development_dependency 'kaminari', ' ~> 0.16.3'
@@ -57,10 +59,4 @@ Gem::Specification.new do |spec|
57
59
  spec.add_development_dependency 'grape', ['>= 0.13', '< 1.0']
58
60
  spec.add_development_dependency 'json_schema'
59
61
  spec.add_development_dependency 'rake', ['>= 10.0', '< 12.0']
60
-
61
- spec.post_install_message = <<-EOF
62
- NOTE: The default key case for the JsonApi adapter has changed to dashed.
63
- See https://github.com/rails-api/active_model_serializers/blob/master/docs/general/key_transforms.md
64
- for more information on configuring this behavior.
65
- EOF
66
62
  end
@@ -67,9 +67,11 @@ Doesn't follow any specific convention.
67
67
 
68
68
  ### JSON
69
69
 
70
- The response document always with a root key.
70
+ The json response is always rendered with a root key.
71
71
 
72
- The root key **can't be overridden**, and will be derived from the resource being serialized.
72
+ The root key can be overridden by:
73
+ * passing the `root` option in the render call. See details in the [Rendering Guides](rendering.md#overriding-the-root-key).
74
+ * setting the `type` of the serializer. See details in the [Serializers Guide](serializers.md#type).
73
75
 
74
76
  Doesn't follow any specific convention.
75
77
 
@@ -52,9 +52,14 @@ Each adapter has a default key transform configured:
52
52
  `config.key_transform` is a global override of the adapter default. Adapters
53
53
  still prefer the render option `:key_transform` over this setting.
54
54
 
55
+ *NOTE: Key transforms can be expensive operations. If key transforms are unnecessary for the
56
+ application, setting `config.key_transform` to `:unaltered` will provide a performance boost.*
55
57
 
56
- ## JSON API
58
+ ##### default_includes
59
+ What relationships to serialize by default. Default: `'*'`, which includes one level of related
60
+ objects. See [includes](adapters.md#included) for more info.
57
61
 
62
+ ## JSON API
58
63
 
59
64
  ##### jsonapi_resource_type
60
65
 
@@ -42,7 +42,7 @@ document = {
42
42
  'title' => 'Title 1',
43
43
  'date' => '2015-12-20'
44
44
  },
45
- 'associations' => {
45
+ 'relationships' => {
46
46
  'author' => {
47
47
  'data' => {
48
48
  'type' => 'user',
@@ -0,0 +1,31 @@
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.
@@ -73,7 +73,12 @@ See [ARCHITECTURE](../ARCHITECTURE.md) for more information.
73
73
 
74
74
  #### fields
75
75
 
76
- PR please :)
76
+ If you are using `json` or `attributes` adapter
77
+ ```ruby
78
+ render json: @user, fields: [:access_token]
79
+ ```
80
+
81
+ See [Fields](fields.md) for more information.
77
82
 
78
83
  #### adapter
79
84
 
@@ -83,7 +88,7 @@ PR please :)
83
88
 
84
89
  ```render json: posts, each_serializer: PostSerializer, key_transform: :camel_lower```
85
90
 
86
- See [Key Transforms](key_transforms.md) for more informaiton.
91
+ See [Key Transforms](key_transforms.md) for more information.
87
92
 
88
93
  #### meta
89
94
 
@@ -31,10 +31,21 @@ Serialization of the resource `title`
31
31
  |---------------------------- |-------------|
32
32
  | `attribute :title` | `{ title: 'Some Title' } `
33
33
  | `attribute :title, key: :name` | `{ name: 'Some Title' } `
34
- | `attribute :title { 'A Different Title'}` | `{ title: 'A Different Title' } `
34
+ | `attribute(:title) { 'A Different Title'}` | `{ title: 'A Different Title' } `
35
35
  | `attribute :title`<br>`def title 'A Different Title' end` | `{ title: 'A Different Title' }`
36
36
 
37
- [PR please for conditional attributes:)](https://github.com/rails-api/active_model_serializers/pull/1403)
37
+ An `if` or `unless` option can make an attribute conditional. It takes a symbol of a method name on the serializer, or a lambda literal.
38
+
39
+ e.g.
40
+
41
+ ```ruby
42
+ attribute :private_data, if: :is_current_user?
43
+ attribute :another_private_data, if: -> { scope.admin? }
44
+
45
+ def is_current_user?
46
+ object.id == current_user.id
47
+ end
48
+ ```
38
49
 
39
50
  ### Associations
40
51
 
@@ -255,7 +266,7 @@ In the controller, the scope/scope_name options are equal to
255
266
  the [`serialization_scope`method](https://github.com/rails-api/active_model_serializers/blob/d02cd30fe55a3ea85e1d351b6e039620903c1871/lib/action_controller/serialization.rb#L13-L20),
256
267
  which is `:current_user`, by default.
257
268
 
258
- Specfically, the `scope_name` is defaulted to `:current_user`, and may be set as
269
+ Specifically, the `scope_name` is defaulted to `:current_user`, and may be set as
259
270
  `serialization_scope :view_context`. The `scope` is set to `send(scope_name)` when `scope_name` is
260
271
  present and the controller responds to `scope_name`.
261
272
 
@@ -303,6 +314,38 @@ So that when we render the `#edit` action, we'll get
303
314
 
304
315
  Where `can_edit` is `view_context.current_user.admin?` (true).
305
316
 
317
+ You can also tell what to set as `serialization_scope` for specific actions.
318
+
319
+ For example, use `admin_user` only for `Admin::PostSerializer` and `current_user` for rest.
320
+
321
+ ```ruby
322
+ class PostsController < ActionController::Base
323
+
324
+ before_action only: :edit do
325
+ self.class.serialization_scope :admin_user
326
+ end
327
+
328
+ def show
329
+ render json: @post, serializer: PostSerializer
330
+ end
331
+
332
+ def edit
333
+ @post.save
334
+ render json: @post, serializer: Admin::PostSerializer
335
+ end
336
+
337
+ private
338
+
339
+ def admin_user
340
+ User.new(id: 2, name: 'Bob', admin: true)
341
+ end
342
+
343
+ def current_user
344
+ User.new(id: 2, name: 'Bob', admin: false)
345
+ end
346
+ end
347
+ ```
348
+
306
349
  #### #read_attribute_for_serialization(key)
307
350
 
308
351
  The serialized value for a given key. e.g. `read_attribute_for_serialization(:title) #=> 'Hello World'`
@@ -370,3 +413,19 @@ class PostSerializer < ActiveModel::Serializer
370
413
  end
371
414
  end
372
415
  ```
416
+
417
+ ## Overriding association serializer lookup
418
+
419
+ If you want to define a specific serializer lookup for your associations, you can override
420
+ the `ActiveModel::Serializer.serializer_for` method to return a serializer class based on defined conditions.
421
+
422
+ ```ruby
423
+ class MySerializer < ActiveModel::Serializer
424
+ def self.serializer_for(model, options)
425
+ return SparseAdminSerializer if model.class == 'Admin'
426
+ super
427
+ end
428
+
429
+ # the rest of the serializer
430
+ end
431
+ ```
@@ -81,7 +81,7 @@ def pagination_dict(object)
81
81
  {
82
82
  current_page: object.current_page,
83
83
  next_page: object.next_page,
84
- prev_page: object.prev_page,
84
+ prev_page: object.prev_page, # use object.previous_page when using will_paginate
85
85
  total_pages: object.total_pages,
86
86
  total_count: object.total_count
87
87
  }
@@ -126,14 +126,13 @@ def meta_attributes(resource, extra_meta = {})
126
126
  {
127
127
  current_page: resource.current_page,
128
128
  next_page: resource.next_page,
129
- prev_page: resource.prev_page,
129
+ prev_page: resource.prev_page, # use resource.previous_page when using will_paginate
130
130
  total_pages: resource.total_pages,
131
131
  total_count: resource.total_count
132
132
  }.merge(extra_meta)
133
133
  end
134
134
  ```
135
135
 
136
-
137
136
  ### Attributes adapter
138
137
 
139
138
  This adapter does not allow us to use `meta` key, due to that it is not possible to add pagination links.
@@ -17,17 +17,32 @@ To solve this, in Ember, both the adapter and the serializer will need some modi
17
17
 
18
18
  ### Server-Side Changes
19
19
 
20
- there are multiple mimetypes for json that should all be parsed similarly, so
21
- in `config/initializers/mime_types.rb`:
20
+ First, set the adapter type in an initializer file:
21
+
22
+ ```ruby
23
+ # config/initializers/active_model_serializers.rb
24
+ ActiveModelSerializers.config.adapter = :json_api
25
+ ```
26
+
27
+ or:
28
+
29
+ ```ruby
30
+ # config/initializers/active_model_serializers.rb
31
+ ActiveModelSerializers.config.adapter = ActiveModelSerializers::Adapter::JsonApi
32
+ ```
33
+
34
+ You will also want to set the `key_transform` to `:unaltered` since you will adjust the attributes in your Ember serializer to use underscores instead of dashes later. You could also use `:underscore`, but `:unaltered` is better for performance.
35
+
36
+ ```ruby
37
+ # config/initializers/active_model_serializers.rb
38
+ ActiveModelSerializers.config.key_transform = :unaltered
39
+ ```
40
+
41
+ Lastly, in order to properly handle JSON API responses, we need to register a JSON API renderer, like so:
42
+
22
43
  ```ruby
23
- api_mime_types = %W(
24
- application/vnd.api+json
25
- text/x-json
26
- application/json
27
- )
28
-
29
- Mime::Type.unregister :json
30
- Mime::Type.register 'application/json', :json, api_mime_types
44
+ # config/initializers/active_model_serializers.rb
45
+ require 'active_model_serializers/register_jsonapi_renderer'
31
46
  ```
32
47
 
33
48
  ### Adapter Changes
@@ -28,7 +28,7 @@ Example supported requests
28
28
  - Relationships
29
29
  - GET /articles/1/relationships/comments
30
30
  - GET /articles/1/relationships/author
31
- - Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `ActiveModel::Serializer::IncludeTree`
31
+ - Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `JSONAPI::IncludeDirective`
32
32
  - GET /articles/1?`include`=comments
33
33
  - GET /articles/1?`include`=comments.author
34
34
  - GET /articles/1?`include`=author,comments.author
@@ -19,12 +19,13 @@ module ActionController
19
19
  end
20
20
 
21
21
  def serialization_scope
22
- send(_serialization_scope) if _serialization_scope &&
23
- respond_to?(_serialization_scope, true)
22
+ return unless _serialization_scope && respond_to?(_serialization_scope, true)
23
+
24
+ send(_serialization_scope)
24
25
  end
25
26
 
26
27
  def get_serializer(resource, options = {})
27
- if !use_adapter?
28
+ unless use_adapter?
28
29
  warn 'ActionController::Serialization#use_adapter? has been removed. '\
29
30
  "Please pass 'adapter: false' or see ActiveSupport::SerializableResource.new"
30
31
  options[:adapter] = false
@@ -7,9 +7,11 @@ module ActiveModel
7
7
  deprecate :inherited, 'ActiveModelSerializers::Adapter::Base.'
8
8
  end
9
9
 
10
+ # :nocov:
10
11
  def initialize(serializer, options = {})
11
12
  super(ActiveModelSerializers::Adapter::Base.new(serializer, options))
12
13
  end
14
+ # :nocov:
13
15
  end
14
16
  end
15
17
  end
@@ -1,9 +1,12 @@
1
1
  require 'active_model/serializer/collection_serializer'
2
- class ActiveModel::Serializer
3
- class ArraySerializer < CollectionSerializer
4
- class << self
5
- extend ActiveModelSerializers::Deprecate
6
- deprecate :new, 'ActiveModel::Serializer::CollectionSerializer.'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class ArraySerializer < CollectionSerializer
6
+ class << self
7
+ extend ActiveModelSerializers::Deprecate
8
+ deprecate :new, 'ActiveModel::Serializer::CollectionSerializer.'
9
+ end
7
10
  end
8
11
  end
9
12
  end
@@ -10,8 +10,6 @@ module ActiveModel
10
10
  module Associations
11
11
  extend ActiveSupport::Concern
12
12
 
13
- DEFAULT_INCLUDE_TREE = ActiveModel::Serializer::IncludeTree.from_string('*')
14
-
15
13
  included do
16
14
  with_options instance_writer: false, instance_reader: true do |serializer|
17
15
  serializer.class_attribute :_reflections
@@ -41,7 +39,7 @@ module ActiveModel
41
39
  # @example
42
40
  # has_many :comments, serializer: CommentSummarySerializer
43
41
  #
44
- def has_many(name, options = {}, &block)
42
+ def has_many(name, options = {}, &block) # rubocop:disable Style/PredicateName
45
43
  associate(HasManyReflection.new(name, options, block))
46
44
  end
47
45
 
@@ -63,7 +61,7 @@ module ActiveModel
63
61
  # @example
64
62
  # has_one :author, serializer: AuthorSerializer
65
63
  #
66
- def has_one(name, options = {}, &block)
64
+ def has_one(name, options = {}, &block) # rubocop:disable Style/PredicateName
67
65
  associate(HasOneReflection.new(name, options, block))
68
66
  end
69
67
 
@@ -80,17 +78,18 @@ module ActiveModel
80
78
  end
81
79
  end
82
80
 
83
- # @param [IncludeTree] include_tree (defaults to all associations when not provided)
81
+ # @param [JSONAPI::IncludeDirective] include_directive (defaults to the
82
+ # +default_include_directive+ config value when not provided)
84
83
  # @return [Enumerator<Association>]
85
84
  #
86
- def associations(include_tree = DEFAULT_INCLUDE_TREE)
85
+ def associations(include_directive = ActiveModelSerializers.default_include_directive)
87
86
  return unless object
88
87
 
89
88
  Enumerator.new do |y|
90
89
  self.class._reflections.each do |reflection|
91
90
  next if reflection.excluded?(self)
92
91
  key = reflection.options.fetch(:key, reflection.name)
93
- next unless include_tree.key?(key)
92
+ next unless include_directive.key?(key)
94
93
  y.yield reflection.build_association(self, instance_options)
95
94
  end
96
95
  end
@@ -2,9 +2,6 @@ module ActiveModel
2
2
  class Serializer
3
3
  # @api private
4
4
  class BelongsToReflection < SingularReflection
5
- def macro
6
- :belongs_to
7
- end
8
5
  end
9
6
  end
10
7
  end