active_model_serializers 0.10.6 → 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.
Files changed (215) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +114 -1
  3. data/README.md +21 -24
  4. data/lib/action_controller/serialization.rb +11 -1
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  7. data/lib/active_model/serializer/adapter/base.rb +2 -0
  8. data/lib/active_model/serializer/adapter/json.rb +2 -0
  9. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  10. data/lib/active_model/serializer/adapter/null.rb +2 -0
  11. data/lib/active_model/serializer/adapter.rb +2 -0
  12. data/lib/active_model/serializer/array_serializer.rb +2 -0
  13. data/lib/active_model/serializer/association.rb +2 -0
  14. data/lib/active_model/serializer/attribute.rb +2 -0
  15. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  16. data/lib/active_model/serializer/collection_serializer.rb +17 -5
  17. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  18. data/lib/active_model/serializer/error_serializer.rb +2 -0
  19. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  20. data/lib/active_model/serializer/field.rb +2 -0
  21. data/lib/active_model/serializer/fieldset.rb +3 -1
  22. data/lib/active_model/serializer/has_many_reflection.rb +2 -0
  23. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  24. data/lib/active_model/serializer/lazy_association.rb +6 -2
  25. data/lib/active_model/serializer/link.rb +23 -0
  26. data/lib/active_model/serializer/lint.rb +2 -0
  27. data/lib/active_model/serializer/null.rb +2 -0
  28. data/lib/active_model/serializer/reflection.rb +10 -5
  29. data/lib/active_model/serializer/version.rb +3 -1
  30. data/lib/active_model/serializer.rb +37 -19
  31. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  32. data/lib/active_model_serializers/adapter/base.rb +2 -0
  33. data/lib/active_model_serializers/adapter/json.rb +2 -0
  34. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +3 -1
  35. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  37. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  38. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +45 -20
  40. data/lib/active_model_serializers/adapter/json_api/relationship.rb +18 -4
  41. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +33 -25
  42. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  43. data/lib/active_model_serializers/adapter/null.rb +2 -0
  44. data/lib/active_model_serializers/adapter.rb +3 -1
  45. data/lib/active_model_serializers/callbacks.rb +2 -0
  46. data/lib/active_model_serializers/deprecate.rb +2 -0
  47. data/lib/active_model_serializers/deserialization.rb +2 -0
  48. data/lib/active_model_serializers/json_pointer.rb +2 -0
  49. data/lib/active_model_serializers/logging.rb +2 -0
  50. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  51. data/lib/active_model_serializers/model/caching.rb +26 -0
  52. data/lib/active_model_serializers/model.rb +2 -0
  53. data/lib/active_model_serializers/railtie.rb +4 -0
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  55. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  56. data/lib/active_model_serializers/serialization_context.rb +2 -0
  57. data/lib/active_model_serializers/test/schema.rb +2 -0
  58. data/lib/active_model_serializers/test/serializer.rb +2 -0
  59. data/lib/active_model_serializers/test.rb +2 -0
  60. data/lib/active_model_serializers.rb +21 -11
  61. data/lib/generators/rails/resource_override.rb +2 -0
  62. data/lib/generators/rails/serializer_generator.rb +2 -0
  63. data/lib/grape/active_model_serializers.rb +2 -0
  64. data/lib/grape/formatters/active_model_serializers.rb +2 -0
  65. data/lib/grape/helpers/active_model_serializers.rb +2 -0
  66. data/lib/tasks/rubocop.rake +2 -0
  67. metadata +43 -298
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -105
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -55
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -30
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/rubocop +0 -38
  83. data/bin/serve_benchmark +0 -39
  84. data/docs/README.md +0 -41
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -263
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -169
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/fields.md +0 -31
  91. data/docs/general/getting_started.md +0 -133
  92. data/docs/general/instrumentation.md +0 -40
  93. data/docs/general/key_transforms.md +0 -40
  94. data/docs/general/logging.md +0 -21
  95. data/docs/general/rendering.md +0 -293
  96. data/docs/general/serializers.md +0 -480
  97. data/docs/how-open-source-maintained.jpg +0 -0
  98. data/docs/howto/add_pagination_links.md +0 -138
  99. data/docs/howto/add_relationship_links.md +0 -140
  100. data/docs/howto/add_root_key.md +0 -55
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -66
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -73
  105. data/docs/howto/test.md +0 -154
  106. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  107. data/docs/integrations/ember-and-json-api.md +0 -147
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema/schema.json +0 -366
  111. data/docs/jsonapi/schema.md +0 -151
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/test/action_controller/adapter_selector_test.rb +0 -62
  115. data/test/action_controller/explicit_serializer_test.rb +0 -135
  116. data/test/action_controller/json/include_test.rb +0 -246
  117. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  118. data/test/action_controller/json_api/errors_test.rb +0 -40
  119. data/test/action_controller/json_api/fields_test.rb +0 -66
  120. data/test/action_controller/json_api/linked_test.rb +0 -202
  121. data/test/action_controller/json_api/pagination_test.rb +0 -116
  122. data/test/action_controller/json_api/transform_test.rb +0 -189
  123. data/test/action_controller/lookup_proc_test.rb +0 -49
  124. data/test/action_controller/namespace_lookup_test.rb +0 -232
  125. data/test/action_controller/serialization_scope_name_test.rb +0 -235
  126. data/test/action_controller/serialization_test.rb +0 -472
  127. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  128. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  129. data/test/active_model_serializers/logging_test.rb +0 -77
  130. data/test/active_model_serializers/model_test.rb +0 -142
  131. data/test/active_model_serializers/railtie_test_isolated.rb +0 -68
  132. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -161
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  134. data/test/active_model_serializers/test/schema_test.rb +0 -131
  135. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  136. data/test/active_record_test.rb +0 -9
  137. data/test/adapter/attributes_test.rb +0 -40
  138. data/test/adapter/deprecation_test.rb +0 -100
  139. data/test/adapter/json/belongs_to_test.rb +0 -45
  140. data/test/adapter/json/collection_test.rb +0 -104
  141. data/test/adapter/json/has_many_test.rb +0 -53
  142. data/test/adapter/json/transform_test.rb +0 -93
  143. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  144. data/test/adapter/json_api/collection_test.rb +0 -96
  145. data/test/adapter/json_api/errors_test.rb +0 -76
  146. data/test/adapter/json_api/fields_test.rb +0 -96
  147. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  149. data/test/adapter/json_api/has_many_test.rb +0 -173
  150. data/test/adapter/json_api/has_one_test.rb +0 -80
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -183
  152. data/test/adapter/json_api/json_api_test.rb +0 -33
  153. data/test/adapter/json_api/linked_test.rb +0 -413
  154. data/test/adapter/json_api/links_test.rb +0 -95
  155. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  156. data/test/adapter/json_api/parse_test.rb +0 -137
  157. data/test/adapter/json_api/relationship_test.rb +0 -397
  158. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  159. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  160. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  161. data/test/adapter/json_api/transform_test.rb +0 -512
  162. data/test/adapter/json_api/type_test.rb +0 -61
  163. data/test/adapter/json_test.rb +0 -46
  164. data/test/adapter/null_test.rb +0 -22
  165. data/test/adapter/polymorphic_test.rb +0 -171
  166. data/test/adapter_test.rb +0 -67
  167. data/test/array_serializer_test.rb +0 -22
  168. data/test/benchmark/app.rb +0 -65
  169. data/test/benchmark/benchmarking_support.rb +0 -67
  170. data/test/benchmark/bm_active_record.rb +0 -81
  171. data/test/benchmark/bm_adapter.rb +0 -38
  172. data/test/benchmark/bm_caching.rb +0 -119
  173. data/test/benchmark/bm_lookup_chain.rb +0 -83
  174. data/test/benchmark/bm_transform.rb +0 -45
  175. data/test/benchmark/config.ru +0 -3
  176. data/test/benchmark/controllers.rb +0 -83
  177. data/test/benchmark/fixtures.rb +0 -219
  178. data/test/cache_test.rb +0 -651
  179. data/test/collection_serializer_test.rb +0 -123
  180. data/test/fixtures/active_record.rb +0 -113
  181. data/test/fixtures/poro.rb +0 -225
  182. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  183. data/test/generators/serializer_generator_test.rb +0 -75
  184. data/test/grape_test.rb +0 -196
  185. data/test/lint_test.rb +0 -49
  186. data/test/logger_test.rb +0 -20
  187. data/test/poro_test.rb +0 -9
  188. data/test/serializable_resource_test.rb +0 -79
  189. data/test/serializers/association_macros_test.rb +0 -37
  190. data/test/serializers/associations_test.rb +0 -424
  191. data/test/serializers/attribute_test.rb +0 -153
  192. data/test/serializers/attributes_test.rb +0 -52
  193. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  194. data/test/serializers/configuration_test.rb +0 -32
  195. data/test/serializers/fieldset_test.rb +0 -14
  196. data/test/serializers/meta_test.rb +0 -202
  197. data/test/serializers/options_test.rb +0 -32
  198. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  199. data/test/serializers/reflection_test.rb +0 -427
  200. data/test/serializers/root_test.rb +0 -21
  201. data/test/serializers/serialization_test.rb +0 -55
  202. data/test/serializers/serializer_for_test.rb +0 -136
  203. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  204. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  205. data/test/support/isolated_unit.rb +0 -82
  206. data/test/support/rails5_shims.rb +0 -53
  207. data/test/support/rails_app.rb +0 -38
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  209. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  210. data/test/support/schemas/custom/show.json +0 -7
  211. data/test/support/schemas/hyper_schema.json +0 -93
  212. data/test/support/schemas/render_using_json_api.json +0 -43
  213. data/test/support/schemas/simple_json_pointers.json +0 -10
  214. data/test/support/serialization_testing.rb +0 -71
  215. data/test/test_helper.rb +0 -70
@@ -1,480 +0,0 @@
1
- [Back to Guides](../README.md)
2
-
3
- # Serializers
4
-
5
- Given a serializer class:
6
-
7
- ```ruby
8
- class SomeSerializer < ActiveModel::Serializer
9
- end
10
- ```
11
-
12
- The following methods may be defined in it:
13
-
14
- ### Attributes
15
-
16
- #### ::attributes
17
-
18
- Serialization of the resource `title` and `body`
19
-
20
- | In Serializer | #attributes |
21
- |---------------------------- |-------------|
22
- | `attributes :title, :body` | `{ title: 'Some Title', body: 'Some Body' }`
23
- | `attributes :title, :body`<br>`def body "Special #{object.body}" end` | `{ title: 'Some Title', body: 'Special Some Body' }`
24
-
25
-
26
- #### ::attribute
27
-
28
- Serialization of the resource `title`
29
-
30
- | In Serializer | #attributes |
31
- |---------------------------- |-------------|
32
- | `attribute :title` | `{ title: 'Some Title' } `
33
- | `attribute :title, key: :name` | `{ name: 'Some Title' } `
34
- | `attribute(:title) { 'A Different Title'}` | `{ title: 'A Different Title' } `
35
- | `attribute :title`<br>`def title 'A Different Title' end` | `{ title: 'A Different Title' }`
36
-
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
- ```
49
-
50
- ### Associations
51
-
52
- The interface for associations is, generically:
53
-
54
- > `association_type(association_name, options, &block)`
55
-
56
- Where:
57
-
58
- - `association_type` may be `has_one`, `has_many`, `belongs_to`.
59
- - `association_name` is a method name the serializer calls.
60
- - optional: `options` may be:
61
- - `key:` The name used for the serialized association.
62
- - `serializer:`
63
- - `if:`
64
- - `unless:`
65
- - `virtual_value:`
66
- - `polymorphic:` defines if polymorphic relation type should be nested in serialized association.
67
- - `type:` the resource type as used by JSON:API, especially on a `belongs_to` relationship.
68
- - `class_name:` used to determine `type` when `type` not given
69
- - `foreign_key:` used by JSON:API on a `belongs_to` relationship to avoid unnecessarily loading the association object.
70
- - `namespace:` used when looking up the serializer and `serializer` is not given. Falls back to the parent serializer's `:namespace` instance options, which, when present, comes from the render options. See [Rendering#namespace](rendering.md#namespace] for more details.
71
- - optional: `&block` is a context that returns the association's attributes.
72
- - prevents `association_name` method from being called.
73
- - return value of block is used as the association value.
74
- - yields the `serializer` to the block.
75
- - `include_data false` prevents the `data` key from being rendered in the JSON API relationship.
76
-
77
- #### ::has_one
78
-
79
- e.g.
80
-
81
- ```ruby
82
- has_one :bio
83
- has_one :blog, key: :site
84
- has_one :maker, virtual_value: { id: 1 }
85
-
86
- has_one :blog do |serializer|
87
- serializer.cached_blog
88
- end
89
-
90
- def cached_blog
91
- cache_store.fetch("cached_blog:#{object.updated_at}") do
92
- Blog.find(object.blog_id)
93
- end
94
- end
95
- ```
96
-
97
- ```ruby
98
- has_one :blog, if: :show_blog?
99
- # you can also use a string or lambda
100
- # has_one :blog, if: 'scope.admin?'
101
- # has_one :blog, if: -> (serializer) { serializer.scope.admin? }
102
- # has_one :blog, if: -> { scope.admin? }
103
-
104
- def show_blog?
105
- scope.admin?
106
- end
107
- ```
108
-
109
- #### ::has_many
110
-
111
- e.g.
112
-
113
- ```ruby
114
- has_many :comments
115
- has_many :comments, key: :reviews
116
- has_many :comments, serializer: CommentPreviewSerializer
117
- has_many :reviews, virtual_value: [{ id: 1 }, { id: 2 }]
118
- has_many :comments, key: :last_comments do
119
- last(1)
120
- end
121
- ```
122
-
123
- #### ::belongs_to
124
-
125
- e.g.
126
-
127
- ```ruby
128
- belongs_to :author, serializer: AuthorPreviewSerializer
129
- belongs_to :author, key: :writer
130
- belongs_to :post
131
- belongs_to :blog
132
- def blog
133
- Blog.new(id: 999, name: 'Custom blog')
134
- end
135
- ```
136
-
137
- ### Polymorphic Relationships
138
-
139
- Polymorphic relationships are serialized by specifying the relationship, like any other association. For example:
140
-
141
- ```ruby
142
- class PictureSerializer < ActiveModel::Serializer
143
- has_one :imageable
144
- end
145
- ```
146
-
147
- You can specify the serializers by [overriding serializer_for](serializers.md#overriding-association-serializer-lookup). For more context about polymorphic relationships, see the [tests](../../test/adapter/polymorphic_test.rb) for each adapter.
148
-
149
- ### Caching
150
-
151
- #### ::cache
152
-
153
- e.g.
154
-
155
- ```ruby
156
- cache key: 'post', expires_in: 0.1, skip_digest: true
157
- cache expires_in: 1.day, skip_digest: true
158
- cache key: 'writer', skip_digest: true
159
- cache only: [:name], skip_digest: true
160
- cache except: [:content], skip_digest: true
161
- cache key: 'blog'
162
- cache only: [:id]
163
- ```
164
-
165
- #### #cache_key
166
-
167
- e.g.
168
-
169
- ```ruby
170
- # Uses a custom non-time-based cache key
171
- def cache_key
172
- "#{self.class.name.downcase}/#{self.id}"
173
- end
174
- ```
175
-
176
- ### Other
177
-
178
- #### ::type
179
-
180
- When using the `:json_api` adapter, the `::type` method defines the JSONAPI [type](http://jsonapi.org/format/#document-resource-object-identification) that will be rendered for this serializer.
181
-
182
- When using the `:json` adapter, the `::type` method defines the name of the root element.
183
-
184
- It either takes a `String` or `Symbol` as parameter.
185
-
186
- Note: This method is useful only when using the `:json_api` or `:json` adapter.
187
-
188
- Examples:
189
- ```ruby
190
- class UserProfileSerializer < ActiveModel::Serializer
191
- type 'profile'
192
-
193
- attribute :name
194
- end
195
- class AuthorProfileSerializer < ActiveModel::Serializer
196
- type :profile
197
-
198
- attribute :name
199
- end
200
- ```
201
-
202
- With the `:json_api` adapter, the previous serializers would be rendered as:
203
-
204
- ``` json
205
- {
206
- "data": {
207
- "id": "1",
208
- "type": "profile",
209
- "attributes": {
210
- "name": "Julia"
211
- }
212
- }
213
- }
214
- ```
215
-
216
- With the `:json` adapter, the previous serializer would be rendered as:
217
-
218
- ``` json
219
- {
220
- "profile": {
221
- "name": "Julia"
222
- }
223
- }
224
- ```
225
-
226
- #### ::link
227
-
228
- ```ruby
229
- link :self do
230
- href "https://example.com/link_author/#{object.id}"
231
- end
232
- link(:author) { link_author_url(object) }
233
- link(:link_authors) { link_authors_url }
234
- link :other, 'https://example.com/resource'
235
- link(:posts) { link_author_posts_url(object) }
236
- ```
237
-
238
- #### #object
239
-
240
- The object being serialized.
241
-
242
- #### #root
243
-
244
- Resource root which is included in `JSON` adapter. As you can see at [Adapters Document](adapters.md), `Attribute` adapter (default) and `JSON API` adapter does not include root at top level.
245
- By default, the resource root comes from the `model_name` of the serialized object's class.
246
-
247
- There are several ways to specify root:
248
- * [Overriding the root key](rendering.md#overriding-the-root-key)
249
- * [Setting `type`](serializers.md#type)
250
- * Specifying the `root` option, e.g. `root: 'specific_name'`, during the serializer's initialization:
251
-
252
- ```ruby
253
- ActiveModelSerializers::SerializableResource.new(foo, root: 'bar')
254
- ```
255
-
256
- #### #scope
257
-
258
- Allows you to include in the serializer access to an external method.
259
-
260
- It's intended to provide an authorization context to the serializer, so that
261
- you may e.g. show an admin all comments on a post, else only published comments.
262
-
263
- - `scope` is a method on the serializer instance that comes from `options[:scope]`. It may be nil.
264
- - `scope_name` is an option passed to the new serializer (`options[:scope_name]`). The serializer
265
- defines a method with that name that calls the `scope`, e.g. `def current_user; scope; end`.
266
- Note: it does not define the method if the serializer instance responds to it.
267
-
268
- That's a lot of words, so here's some examples:
269
-
270
- First, let's assume the serializer is instantiated in the controller, since that's the usual scenario.
271
- We'll refer to the serialization context as `controller`.
272
-
273
- | options | `Serializer#scope` | method definition |
274
- |-------- | ------------------|--------------------|
275
- | `scope: current_user, scope_name: :current_user` | `current_user` | `Serializer#current_user` calls `controller.current_user`
276
- | `scope: view_context, scope_name: :view_context` | `view_context` | `Serializer#view_context` calls `controller.view_context`
277
-
278
- We can take advantage of the scope to customize the objects returned based
279
- on the current user (scope).
280
-
281
- For example, we can limit the posts the current user sees to those they created:
282
-
283
- ```ruby
284
- class PostSerializer < ActiveModel::Serializer
285
- attributes :id, :title, :body
286
-
287
- # scope comments to those created_by the current user
288
- has_many :comments do
289
- object.comments.where(created_by: current_user)
290
- end
291
- end
292
- ```
293
-
294
- Whether you write the method as above or as `object.comments.where(created_by: scope)`
295
- is a matter of preference (assuming `scope_name` has been set).
296
-
297
- ##### Controller Authorization Context
298
-
299
- In the controller, the scope/scope_name options are equal to
300
- the [`serialization_scope`method](https://github.com/rails-api/active_model_serializers/blob/d02cd30fe55a3ea85e1d351b6e039620903c1871/lib/action_controller/serialization.rb#L13-L20),
301
- which is `:current_user`, by default.
302
-
303
- Specifically, the `scope_name` is defaulted to `:current_user`, and may be set as
304
- `serialization_scope :view_context`. The `scope` is set to `send(scope_name)` when `scope_name` is
305
- present and the controller responds to `scope_name`.
306
-
307
- Thus, in a serializer, the controller provides `current_user` as the
308
- current authorization scope when you call `render :json`.
309
-
310
- **IMPORTANT**: Since the scope is set at render, you may want to customize it so that `current_user` isn't
311
- called on every request. This was [also a problem](https://github.com/rails-api/active_model_serializers/pull/1252#issuecomment-159810477)
312
- in [`0.9`](https://github.com/rails-api/active_model_serializers/tree/0-9-stable#customizing-scope).
313
-
314
- We can change the scope from `current_user` to `view_context`.
315
-
316
- ```diff
317
- class SomeController < ActionController::Base
318
- + serialization_scope :view_context
319
-
320
- def current_user
321
- User.new(id: 2, name: 'Bob', admin: true)
322
- end
323
-
324
- def edit
325
- user = User.new(id: 1, name: 'Pete')
326
- render json: user, serializer: AdminUserSerializer, adapter: :json_api
327
- end
328
- end
329
- ```
330
-
331
- We could then use the controller method `view_context` in our serializer, like so:
332
-
333
- ```diff
334
- class AdminUserSerializer < ActiveModel::Serializer
335
- attributes :id, :name, :can_edit
336
-
337
- def can_edit?
338
- + view_context.current_user.admin?
339
- end
340
- end
341
- ```
342
-
343
- So that when we render the `#edit` action, we'll get
344
-
345
- ```json
346
- {"data":{"id":"1","type":"users","attributes":{"name":"Pete","can_edit":true}}}
347
- ```
348
-
349
- Where `can_edit` is `view_context.current_user.admin?` (true).
350
-
351
- You can also tell what to set as `serialization_scope` for specific actions.
352
-
353
- For example, use `admin_user` only for `Admin::PostSerializer` and `current_user` for rest.
354
-
355
- ```ruby
356
- class PostsController < ActionController::Base
357
-
358
- before_action only: :edit do
359
- self.class.serialization_scope :admin_user
360
- end
361
-
362
- def show
363
- render json: @post, serializer: PostSerializer
364
- end
365
-
366
- def edit
367
- @post.save
368
- render json: @post, serializer: Admin::PostSerializer
369
- end
370
-
371
- private
372
-
373
- def admin_user
374
- User.new(id: 2, name: 'Bob', admin: true)
375
- end
376
-
377
- def current_user
378
- User.new(id: 2, name: 'Bob', admin: false)
379
- end
380
- end
381
- ```
382
-
383
- #### #read_attribute_for_serialization(key)
384
-
385
- The serialized value for a given key. e.g. `read_attribute_for_serialization(:title) #=> 'Hello World'`
386
-
387
- #### #links
388
-
389
- Allows you to modify the `links` node. By default, this node will be populated with the attributes set using the [::link](#link) method. Using `links: nil` will remove the `links` node.
390
-
391
- ```ruby
392
- ActiveModelSerializers::SerializableResource.new(
393
- @post,
394
- adapter: :json_api,
395
- links: {
396
- self: {
397
- href: 'http://example.com/posts',
398
- meta: {
399
- stuff: 'value'
400
- }
401
- }
402
- }
403
- )
404
- ```
405
-
406
- #### #json_key
407
-
408
- Returns the key used by the adapter as the resource root. See [root](#root) for more information.
409
-
410
- ## Examples
411
-
412
- Given two models, a `Post(title: string, body: text)` and a
413
- `Comment(name: string, body: text, post_id: integer)`, you will have two
414
- serializers:
415
-
416
- ```ruby
417
- class PostSerializer < ActiveModel::Serializer
418
- cache key: 'posts', expires_in: 3.hours
419
- attributes :title, :body
420
-
421
- has_many :comments
422
- end
423
- ```
424
-
425
- and
426
-
427
- ```ruby
428
- class CommentSerializer < ActiveModel::Serializer
429
- attributes :name, :body
430
-
431
- belongs_to :post
432
- end
433
- ```
434
-
435
- Generally speaking, you, as a user of ActiveModelSerializers, will write (or generate) these
436
- serializer classes.
437
-
438
- ## More Info
439
-
440
- For more information, see [the Serializer class on GitHub](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model/serializer.rb)
441
-
442
- ## Overriding association methods
443
-
444
- To override an association, call `has_many`, `has_one` or `belongs_to` with a block:
445
-
446
- ```ruby
447
- class PostSerializer < ActiveModel::Serializer
448
- has_many :comments do
449
- object.comments.active
450
- end
451
- end
452
- ```
453
-
454
- ## Overriding attribute methods
455
-
456
- To override an attribute, call `attribute` with a block:
457
-
458
- ```ruby
459
- class PostSerializer < ActiveModel::Serializer
460
- attribute :body do
461
- object.body.downcase
462
- end
463
- end
464
- ```
465
-
466
- ## Overriding association serializer lookup
467
-
468
- If you want to define a specific serializer lookup for your associations, you can override
469
- the `ActiveModel::Serializer.serializer_for` method to return a serializer class based on defined conditions.
470
-
471
- ```ruby
472
- class MySerializer < ActiveModel::Serializer
473
- def self.serializer_for(model, options)
474
- return SparseAdminSerializer if model.class == 'Admin'
475
- super
476
- end
477
-
478
- # the rest of the serializer
479
- end
480
- ```
Binary file
@@ -1,138 +0,0 @@
1
- [Back to Guides](../README.md)
2
-
3
- # How to add pagination links
4
-
5
- ### JSON API adapter
6
-
7
- Pagination links will be included in your response automatically as long as
8
- the resource is paginated and if you are using the ```JsonApi``` adapter.
9
-
10
- If you want pagination links in your response, use [Kaminari](https://github.com/amatsuda/kaminari)
11
- or [WillPaginate](https://github.com/mislav/will_paginate).
12
-
13
- Although the other adapters do not have this feature, it is possible to
14
- implement pagination links to `JSON` adapter. For more information about it,
15
- please check our docs.
16
-
17
- ###### Kaminari examples
18
-
19
- ```ruby
20
- #array
21
- @posts = Kaminari.paginate_array([1, 2, 3]).page(3).per(1)
22
- render json: @posts
23
-
24
- #active_record
25
- @posts = Post.page(3).per(1)
26
- render json: @posts
27
- ```
28
-
29
- ###### WillPaginate examples
30
-
31
- ```ruby
32
- #array
33
- @posts = [1,2,3].paginate(page: 3, per_page: 1)
34
- render json: @posts
35
-
36
- #active_record
37
- @posts = Post.page(3).per_page(1)
38
- render json: @posts
39
- ```
40
-
41
- ```ruby
42
- ActiveModelSerializers.config.adapter = :json_api
43
- ```
44
-
45
- ex:
46
- ```json
47
- {
48
- "data": [
49
- {
50
- "type": "articles",
51
- "id": "3",
52
- "attributes": {
53
- "title": "JSON API paints my bikeshed!",
54
- "body": "The shortest article. Ever.",
55
- "created": "2015-05-22T14:56:29.000Z",
56
- "updated": "2015-05-22T14:56:28.000Z"
57
- }
58
- }
59
- ],
60
- "links": {
61
- "self": "http://example.com/articles?page[number]=3&page[size]=1",
62
- "first": "http://example.com/articles?page[number]=1&page[size]=1",
63
- "prev": "http://example.com/articles?page[number]=2&page[size]=1",
64
- "next": "http://example.com/articles?page[number]=4&page[size]=1",
65
- "last": "http://example.com/articles?page[number]=13&page[size]=1"
66
- }
67
- }
68
- ```
69
-
70
- ActiveModelSerializers pagination relies on a paginated collection with the methods `current_page`, `total_pages`, and `size`, such as are supported by both [Kaminari](https://github.com/amatsuda/kaminari) or [WillPaginate](https://github.com/mislav/will_paginate).
71
-
72
-
73
- ### JSON adapter
74
-
75
- If you are not using `JSON` adapter, pagination links will not be included automatically, but it is possible to do so using `meta` key.
76
-
77
- Add this method to your base API controller.
78
-
79
- ```ruby
80
- def pagination_dict(collection)
81
- {
82
- current_page: collection.current_page,
83
- next_page: collection.next_page,
84
- prev_page: collection.prev_page, # use collection.previous_page when using will_paginate
85
- total_pages: collection.total_pages,
86
- total_count: collection.total_count
87
- }
88
- end
89
- ```
90
-
91
- Then, use it on your render method.
92
-
93
- ```ruby
94
- render json: posts, meta: pagination_dict(posts)
95
- ```
96
-
97
- ex.
98
- ```json
99
- {
100
- "posts": [
101
- {
102
- "id": 2,
103
- "title": "JSON API paints my bikeshed!",
104
- "body": "The shortest article. Ever."
105
- }
106
- ],
107
- "meta": {
108
- "current_page": 3,
109
- "next_page": 4,
110
- "prev_page": 2,
111
- "total_pages": 10,
112
- "total_count": 10
113
- }
114
- }
115
- ```
116
-
117
- You can also achieve the same result if you have a helper method that adds the pagination info in the meta tag. For instance, in your action specify a custom serializer.
118
-
119
- ```ruby
120
- render json: @posts, each_serializer: PostPreviewSerializer, meta: meta_attributes(@posts)
121
- ```
122
-
123
- ```ruby
124
- #expects pagination!
125
- def meta_attributes(collection, extra_meta = {})
126
- {
127
- current_page: collection.current_page,
128
- next_page: collection.next_page,
129
- prev_page: collection.prev_page, # use collection.previous_page when using will_paginate
130
- total_pages: collection.total_pages,
131
- total_count: collection.total_count
132
- }.merge(extra_meta)
133
- end
134
- ```
135
-
136
- ### Attributes adapter
137
-
138
- This adapter does not allow us to use `meta` key, due to that it is not possible to add pagination links.