active_model_serializers 0.9.0 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +113 -0
  3. data/README.md +112 -19
  4. data/lib/action_controller/serialization.rb +35 -8
  5. data/lib/action_controller/serialization_test_case.rb +4 -4
  6. data/lib/active_model/array_serializer.rb +13 -10
  7. data/lib/active_model/default_serializer.rb +2 -6
  8. data/lib/active_model/serializable.rb +30 -11
  9. data/lib/active_model/serializable/utils.rb +16 -0
  10. data/lib/active_model/serializer.rb +90 -40
  11. data/lib/active_model/serializer/{associations.rb → association.rb} +8 -52
  12. data/lib/active_model/serializer/association/has_many.rb +39 -0
  13. data/lib/active_model/serializer/association/has_one.rb +25 -0
  14. data/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb +1 -1
  15. data/lib/active_model/serializer/railtie.rb +12 -0
  16. data/lib/active_model/serializer/version.rb +1 -1
  17. data/lib/active_model_serializers.rb +1 -1
  18. data/lib/active_model_serializers/model/caching.rb +25 -0
  19. data/test/benchmark/app.rb +60 -0
  20. data/test/benchmark/benchmarking_support.rb +67 -0
  21. data/test/benchmark/bm_active_record.rb +41 -0
  22. data/test/benchmark/setup.rb +75 -0
  23. data/test/benchmark/tmp/miniprofiler/mp_timers_6eqewtfgrhitvq5gqm25 +0 -0
  24. data/test/benchmark/tmp/miniprofiler/mp_timers_8083sx03hu72pxz1a4d0 +0 -0
  25. data/test/benchmark/tmp/miniprofiler/mp_timers_fyz2gsml4z0ph9kpoy1c +0 -0
  26. data/test/benchmark/tmp/miniprofiler/mp_timers_hjry5rc32imd42oxoi48 +0 -0
  27. data/test/benchmark/tmp/miniprofiler/mp_timers_m8fpoz2cvt3g9agz0bs3 +0 -0
  28. data/test/benchmark/tmp/miniprofiler/mp_timers_p92m2drnj1i568u3sta0 +0 -0
  29. data/test/benchmark/tmp/miniprofiler/mp_timers_qg52tpca3uesdfguee9i +0 -0
  30. data/test/benchmark/tmp/miniprofiler/mp_timers_s15t1a6mvxe0z7vjv790 +0 -0
  31. data/test/benchmark/tmp/miniprofiler/mp_timers_x8kal3d17nfds6vp4kcj +0 -0
  32. data/test/benchmark/tmp/miniprofiler/mp_views_127.0.0.1 +0 -0
  33. data/test/fixtures/active_record.rb +4 -0
  34. data/test/fixtures/poro.rb +149 -1
  35. data/test/fixtures/template.html.erb +1 -0
  36. data/test/integration/action_controller/namespaced_serialization_test.rb +105 -0
  37. data/test/integration/action_controller/serialization_test.rb +5 -5
  38. data/test/integration/action_controller/serialization_test_case_test.rb +10 -0
  39. data/test/integration/active_record/active_record_test.rb +19 -2
  40. data/test/test_app.rb +3 -0
  41. data/test/tmp/app/assets/javascripts/accounts.js +2 -0
  42. data/test/tmp/app/assets/stylesheets/accounts.css +4 -0
  43. data/test/tmp/app/controllers/accounts_controller.rb +2 -0
  44. data/test/tmp/app/helpers/accounts_helper.rb +2 -0
  45. data/test/tmp/app/serializers/account_serializer.rb +3 -0
  46. data/test/tmp/config/routes.rb +1 -0
  47. data/test/unit/active_model/array_serializer/options_test.rb +16 -0
  48. data/test/unit/active_model/array_serializer/serialization_test.rb +18 -1
  49. data/test/unit/active_model/serializer/associations/build_serializer_test.rb +15 -0
  50. data/test/unit/active_model/serializer/associations_test.rb +30 -0
  51. data/test/unit/active_model/serializer/attributes_test.rb +16 -0
  52. data/test/unit/active_model/serializer/config_test.rb +3 -0
  53. data/test/unit/active_model/serializer/has_many_polymorphic_test.rb +189 -0
  54. data/test/unit/active_model/serializer/has_many_test.rb +52 -17
  55. data/test/unit/active_model/serializer/has_one_and_has_many_test.rb +27 -0
  56. data/test/unit/active_model/serializer/has_one_polymorphic_test.rb +196 -0
  57. data/test/unit/active_model/serializer/has_one_test.rb +46 -0
  58. data/test/unit/active_model/serializer/options_test.rb +27 -0
  59. data/test/unit/active_model/serializer/url_helpers_test.rb +35 -0
  60. data/test/unit/active_model/serilizable_test.rb +50 -0
  61. metadata +98 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 65701e1dd4ae30a60340c60fa9361c540148bb64
4
- data.tar.gz: f7b2b52348b116ac1eea607a51e9ddb8d9c15fce
2
+ SHA256:
3
+ metadata.gz: e9f526564b9458ceea3d9391ddbf81cf996ff713dbb217bcec1c22931b4cd028
4
+ data.tar.gz: ac5641428e5b17ffa605bc7337f8f77000354a2a47f1a5ed7244ab50cdca84b2
5
5
  SHA512:
6
- metadata.gz: 658d1fadb66a26b4b93a72cdb87498bb89ee83565de5d846ca3e2cdaa913303256e9267627d8e55593aa1696963f255e2fe44918e858ce2e66251710d3694241
7
- data.tar.gz: 2b100c2bcb26d9696001eefae6fd3bddc68d779578c2c313f64b06f47cf51024f6e525a7afd70d8afd28d973bb7fd2d9bb7923391d2271233317d2a6669948b0
6
+ metadata.gz: af47a8298fbc563716f0c7b4a9e0d92b85243ead1b0ccac561703d17f09574a3e65f280adedbb24ee7d65c0634c4ca343c58aa665628ff75d7e220b89025e91d
7
+ data.tar.gz: 6974a26799a967fbb8b172092be014deb775909a52cf10cf4e7dc88b5c05c96f6b6acbb3d245f9ad9032c743c2048c1afd8335d3a899c3111f2d6b48015800f7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,110 @@
1
+ ## 0.09.x
2
+
3
+ ### [0-9-stable](https://github.com/rails-api/active_model_serializers/compare/v0.9.8...0-9-stable)
4
+
5
+ ### [v0.9.8 (2020-12-10)](https://github.com/rails-api/active_model_serializers/compare/v0.9.7...v0.9.8)
6
+
7
+ - [#2373](https://github.com/rails-api/active_model_serializers/pull/2373) Fix Rails 6.0 deprecation warnings. (@supremebeing7)
8
+
9
+ ### [v0.9.7 (2017-05-01)](https://github.com/rails-api/active_model_serializers/compare/v0.9.6...v0.9.7)
10
+
11
+ - [#2080](https://github.com/rails-api/active_model_serializers/pull/2080) remove `{ payload: nil }` from `!serialize.active_model_serializers` ActiveSupport::Notification. `payload` never had a value. Changes, for example `{ serializer: 'ActiveModel::DefaultSerializer', payload: nil }` to be `{ serializer: 'ActiveModel::DefaultSerializer' }` (@yosiat)
12
+
13
+ ### [v0.9.6 (2017-01-10)](https://github.com/rails-api/active_model_serializers/compare/v0.9.5...v0.9.6)
14
+
15
+ - [#2008](https://github.com/rails-api/active_model_serializers/pull/2008) Fix warning on Thor. (@kirs)
16
+
17
+ ### [v0.9.5 (2016-03-30)](https://github.com/rails-api/active_model_serializers/compare/v0.9.4...v0.9.5)
18
+
19
+ - [#1607](https://github.com/rails-api/active_model_serializers/pull/1607) Merge multiple nested associations. (@Hirtenknogger)
20
+
21
+ ### [v0.9.4 (2016-01-05)](https://github.com/rails-api/active_model_serializers/compare/v0.9.3...v0.9.4)
22
+
23
+ - [#752](https://github.com/rails-api/active_model_serializers/pull/752) Tiny improvement of README 0-9-stable (@basiam)
24
+ - [#749](https://github.com/rails-api/active_model_serializers/pull/749) remove trailing whitespace (@shwoodard)
25
+ - [#717](https://github.com/rails-api/active_model_serializers/pull/717) fixed issue with rendering Hash which appears in rails 4.2.0.beta4 (@kurko, @greshny)
26
+ - [#790](https://github.com/rails-api/active_model_serializers/pull/790) pass context to ArraySerializer (@lanej)
27
+ - [#797](https://github.com/rails-api/active_model_serializers/pull/797) Fix and test for #490 (@afn)
28
+ - [#813](https://github.com/rails-api/active_model_serializers/pull/813) Allow to define custom serializer for given class (@jtomaszewski)
29
+ - [#841](https://github.com/rails-api/active_model_serializers/pull/841) Fix issue with embedding multiple associations under the same root key (@antstorm)
30
+ - [#748](https://github.com/rails-api/active_model_serializers/pull/748) Propagate serialization_options across associations (@raphaelpereira)
31
+
32
+ ### [v0.9.3 (2015/01/21 20:29 +00:00)](https://github.com/rails-api/active_model_serializers/compare/v0.9.2...v0.9.3)
33
+
34
+ Features:
35
+ - [#774](https://github.com/rails-api/active_model_serializers/pull/774) Fix nested include attributes (@nhocki)
36
+ - [#771](https://github.com/rails-api/active_model_serializers/pull/771) Make linked resource type names consistent with root names (@sweatypitts)
37
+ - [#696](https://github.com/rails-api/active_model_serializers/pull/696) Explicitly set serializer for associations (@ggordon)
38
+ - [#700](https://github.com/rails-api/active_model_serializers/pull/700) sparse fieldsets (@arenoir)
39
+ - [#768](https://github.com/rails-api/active_model_serializers/pull/768) Adds support for `meta` and `meta_key` attribute (@kurko)
40
+
41
+ ### [v0.9.2](https://github.com/rails-api/active_model_serializers/compare/v0.9.1...v0.9.2)
42
+
43
+ ### [v0.9.1 (2014/12/04 11:54 +00:00)](https://github.com/rails-api/active_model_serializers/compare/v0.9.0...v0.9.1)
44
+
45
+ - [#707](https://github.com/rails-api/active_model_serializers/pull/707) A Friendly Note on Which AMS Version to Use (@jherdman)
46
+ - [#730](https://github.com/rails-api/active_model_serializers/pull/730) Fixes nested has_many links in JSONAPI (@kurko)
47
+ - [#718](https://github.com/rails-api/active_model_serializers/pull/718) Allow overriding the adapter with render option (@ggordon)
48
+ - [#720](https://github.com/rails-api/active_model_serializers/pull/720) Rename attribute with :key (0.8.x compatibility) (@ggordon)
49
+ - [#728](https://github.com/rails-api/active_model_serializers/pull/728) Use type as key for linked resources (@kurko)
50
+ - [#729](https://github.com/rails-api/active_model_serializers/pull/729) Use the new beta build env on Travis (@joshk)
51
+ - [#703](https://github.com/rails-api/active_model_serializers/pull/703) Support serializer and each_serializer options in renderer (@ggordon, @mieko)
52
+ - [#727](https://github.com/rails-api/active_model_serializers/pull/727) Includes links inside of linked resources (@kurko)
53
+ - [#726](https://github.com/rails-api/active_model_serializers/pull/726) Bugfix: include nested has_many associations (@kurko)
54
+ - [#722](https://github.com/rails-api/active_model_serializers/pull/722) Fix infinite recursion (@ggordon)
55
+ - [#1](https://github.com/rails-api/active_model_serializers/pull/1) Allow for the implicit use of ArraySerializer when :each_serializer is specified (@mieko)
56
+ - [#692](https://github.com/rails-api/active_model_serializers/pull/692) Include 'linked' member for json-api collections (@ggordon)
57
+ - [#714](https://github.com/rails-api/active_model_serializers/pull/714) Define as_json instead of to_json (@guilleiguaran)
58
+ - [#710](https://github.com/rails-api/active_model_serializers/pull/710) JSON-API: Don't include linked section if associations are empty (@guilleiguaran)
59
+ - [#711](https://github.com/rails-api/active_model_serializers/pull/711) Fixes rbx gems bundling on TravisCI (@kurko)
60
+ - [#709](https://github.com/rails-api/active_model_serializers/pull/709) Add type key when association name is different than object type (@guilleiguaran)
61
+ - [#708](https://github.com/rails-api/active_model_serializers/pull/708) Handle correctly null associations (@guilleiguaran)
62
+ - [#691](https://github.com/rails-api/active_model_serializers/pull/691) Fix embed option for associations (@jacob-s-son)
63
+ - [#689](https://github.com/rails-api/active_model_serializers/pull/689) Fix support for custom root in JSON-API adapter (@guilleiguaran)
64
+ - [#685](https://github.com/rails-api/active_model_serializers/pull/685) Serialize ids as strings in JSON-API adapter (@guilleiguaran)
65
+ - [#684](https://github.com/rails-api/active_model_serializers/pull/684) Refactor adapters to implement support for array serialization (@guilleiguaran)
66
+ - [#682](https://github.com/rails-api/active_model_serializers/pull/682) Include root by default in JSON-API serializers (@guilleiguaran)
67
+ - [#625](https://github.com/rails-api/active_model_serializers/pull/625) Add DSL for urls (@JordanFaust)
68
+ - [#677](https://github.com/rails-api/active_model_serializers/pull/677) Add support for embed: :ids option for in associations (@guilleiguaran)
69
+ - [#681](https://github.com/rails-api/active_model_serializers/pull/681) Check superclasses for Serializers (@quainjn)
70
+ - [#680](https://github.com/rails-api/active_model_serializers/pull/680) Add support for root keys (@NullVoxPopuli)
71
+ - [#675](https://github.com/rails-api/active_model_serializers/pull/675) Support Rails 4.2.0 (@tricknotes)
72
+ - [#667](https://github.com/rails-api/active_model_serializers/pull/667) Require only activemodel instead of full rails (@guilleiguaran)
73
+ - [#653](https://github.com/rails-api/active_model_serializers/pull/653) Add "_test" suffix to JsonApi::HasManyTest filename. (@alexgenco)
74
+ - [#631](https://github.com/rails-api/active_model_serializers/pull/631) Update build badge URL (@craiglittle)
75
+
76
+ ### [v0.9.0](https://github.com/rails-api/active_model_serializers/compare/v0.9.0.alpha1...v0.9.0)
77
+
78
+ ### [0.9.0.alpha1 - January 7, 2014](https://github.com/rails-api/active_model_serializers/compare/d72b66d4c...v0.9.0.alpha1)
79
+
80
+ ### 0.9.0.pre
81
+
82
+ * The following methods were removed
83
+ - Model#active\_model\_serializer
84
+ - Serializer#include!
85
+ - Serializer#include?
86
+ - Serializer#attr\_disabled=
87
+ - Serializer#cache
88
+ - Serializer#perform\_caching
89
+ - Serializer#schema (needs more discussion)
90
+ - Serializer#attribute
91
+ - Serializer#include\_#{name}? (filter method added)
92
+ - Serializer#attributes (took a hash)
93
+
94
+ * The following things were added
95
+ - Serializer#filter method
96
+ - CONFIG object
97
+
98
+ * Remove support for ruby 1.8 versions.
99
+
100
+ * Require rails >= 3.2.
101
+
102
+ * Serializers for associations are being looked up in a parent serializer's namespace first. Same with controllers' namespaces.
103
+
104
+ * Added a "prefix" option in case you want to use a different version of serializer.
105
+
106
+ * Serializers default namespace can be set in `default_serializer_options` and inherited by associations.
107
+
1
108
  # VERSION 0.9.0.pre
2
109
 
3
110
  * The following methods were removed
@@ -20,6 +127,12 @@
20
127
 
21
128
  * Require rails >= 3.2.
22
129
 
130
+ * Serializers for associations are being looked up in a parent serializer's namespace first. Same with controllers' namespaces.
131
+
132
+ * Added a "prefix" option in case you want to use a different version of serializer.
133
+
134
+ * Serializers default namespace can be set in `default_serializer_options` and inherited by associations.
135
+
23
136
  # VERSION 0.8.1
24
137
 
25
138
  * Fix bug whereby a serializer using 'options' would blow up.
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
- [![Build Status](https://api.travis-ci.org/rails-api/active_model_serializers.png?branch=0-9-stable)](https://travis-ci.org/rails-api/active_model_serializers)
2
- [![Code Climate](https://codeclimate.com/github/rails-api/active_model_serializers.png)](https://codeclimate.com/github/rails-api/active_model_serializers)
1
+ [![Build Status](https://api.travis-ci.org/rails-api/active_model_serializers.png?branch=0-9-stable)](https://travis-ci.org/rails-api/active_model_serializers)
2
+ [![Code Climate](https://codeclimate.com/github/rails-api/active_model_serializers.png)](https://codeclimate.com/github/rails-api/active_model_serializers)
3
3
 
4
4
  # ActiveModel::Serializers
5
5
 
6
6
  ## Purpose
7
7
 
8
- `ActiveModel::Serializers` encapsulates the JSON serialization of objects.
9
- Objects that respond to read\_attribute\_for\_serialization
8
+ `ActiveModel::Serializers` encapsulates the JSON serialization of objects.
9
+ Objects that respond to read\_attribute\_for\_serialization
10
10
  (including `ActiveModel` and `ActiveRecord` objects) are supported.
11
11
 
12
12
  Serializers know about both a model and the `current_user`, so you can
@@ -85,7 +85,7 @@ it exists, use it to serialize the `Post`.
85
85
 
86
86
  This also works with `respond_with`, which uses `to_json` under the hood. Also
87
87
  note that any options passed to `render :json` will be passed to your
88
- serializer and available as `@options` inside.
88
+ serializer and available as `@serialization_options` inside.
89
89
 
90
90
  To specify a custom serializer for an object, you can specify the
91
91
  serializer when you render the object:
@@ -94,6 +94,17 @@ serializer when you render the object:
94
94
  render json: @post, serializer: FancyPostSerializer
95
95
  ```
96
96
 
97
+ ### Use serialization outside of ActionController::Base
98
+
99
+ When controller does not inherit from ActionController::Base,
100
+ include Serialization module manually:
101
+
102
+ ```ruby
103
+ class ApplicationController < ActionController::API
104
+ include ActionController::Serialization
105
+ end
106
+ ```
107
+
97
108
  ## Arrays
98
109
 
99
110
  In your controllers, when you use `render :json` for an array of objects, AMS will
@@ -229,13 +240,25 @@ ActiveModel::Serializer.setup do |config|
229
240
  config.key_format = :lower_camel
230
241
  end
231
242
 
232
- class BlogLowerCamelSerializer < ActiveModel::Serializer
243
+ class BlogLowerCamelSerializer < ActiveModel::Serializer
233
244
  format_keys :lower_camel
234
245
  end
235
246
 
236
247
  BlogSerializer.new(object, key_format: :lower_camel)
237
248
  ```
238
249
 
250
+ ## Changing the default association key type
251
+
252
+ You can specify that serializers use unsuffixed names as association keys by default.
253
+
254
+ ```ruby
255
+ ActiveModel::Serializer.setup do |config|
256
+ config.default_key_type = :name
257
+ end
258
+ ```
259
+
260
+ This will build association keys like `comments` or `author` instead of `comment_ids` or `author_id`.
261
+
239
262
  ## Getting the old version
240
263
 
241
264
  If you find that your project is already relying on the old rails to_json
@@ -281,7 +304,7 @@ Since this shadows any attribute named `object`, you can include them through `o
281
304
 
282
305
  ```ruby
283
306
  class VersionSerializer < ActiveModel::Serializer
284
- attribute :version_object, key: :object
307
+ attributes :version_object
285
308
 
286
309
  def version_object
287
310
  object.object
@@ -316,6 +339,7 @@ And it's also safe to mutate keys argument by doing keys.delete(:author)
316
339
  in case you want to avoid creating two extra arrays. Note that if you do an
317
340
  in-place modification, you still need to return the modified array.
318
341
 
342
+ ### Alias Attribute
319
343
  If you would like the key in the outputted JSON to be different from its name
320
344
  in ActiveRecord, you can declare the attribute with the different name
321
345
  and redefine that method:
@@ -354,7 +378,7 @@ The above usage of `:meta` will produce the following:
354
378
  If you would like to change the meta key name you can use the `:meta_key` option:
355
379
 
356
380
  ```ruby
357
- render json: @posts, serializer: CustomArraySerializer, meta: {total: 10}, meta_key: 'meta_object'
381
+ render json: @posts, serializer: CustomArraySerializer, meta_object: { total: 10 }, meta_key: :meta_object
358
382
  ```
359
383
 
360
384
  The above usage of `:meta_key` will produce the following:
@@ -467,9 +491,6 @@ You may also use the `:serializer` option to specify a custom serializer class a
467
491
 
468
492
  Serializers are only concerned with multiplicity, and not ownership. `belongs_to` ActiveRecord associations can be included using `has_one` in your serializer.
469
493
 
470
- NOTE: polymorphic was removed because was only supported for has\_one
471
- associations and is in the TODO list of the project.
472
-
473
494
  ## Embedding Associations
474
495
 
475
496
  By default, associations will be embedded inside the serialized object. So if
@@ -516,15 +537,15 @@ Now, any associations will be supplied as an Array of IDs:
516
537
  }
517
538
  ```
518
539
 
519
- You may also choose to embed the IDs by the association's name underneath an
520
- `embed_key` for the resource. For example, say we want to change `comment_ids`
540
+ You may also choose to embed the IDs by the association's name underneath a
541
+ `key` for the resource. For example, say we want to change `comment_ids`
521
542
  to `comments` underneath a `links` key:
522
543
 
523
544
  ```ruby
524
545
  class PostSerializer < ActiveModel::Serializer
525
546
  attributes :id, :title, :body
526
547
 
527
- has_many :comments, embed: ids, embed_namespace: :links
548
+ has_many :comments, embed: :ids, key: :comments, embed_namespace: :links
528
549
  end
529
550
  ```
530
551
 
@@ -615,7 +636,7 @@ the root document (say, `linked`), you can specify an `embed_in_root_key`:
615
636
 
616
637
  ```ruby
617
638
  class PostSerializer < ActiveModel::Serializer
618
- embed: ids, include: true, embed_in_root_key: :linked
639
+ embed :ids, include: true, embed_in_root_key: :linked
619
640
 
620
641
  attributes: :id, :title, :body
621
642
  has_many :comments, :tags
@@ -646,8 +667,8 @@ The above would yield the following JSON document:
646
667
  }
647
668
  ```
648
669
 
649
- When side-loading data, your serializer cannot have the `{ root: false }` option,
650
- as this would lead to invalid JSON. If you do not have a root key, the `include`
670
+ When side-loading data, your serializer cannot have the `{ root: false }` option,
671
+ as this would lead to invalid JSON. If you do not have a root key, the `include`
651
672
  instruction will be ignored
652
673
 
653
674
  You can also specify a different root for the embedded objects than the key
@@ -686,7 +707,7 @@ class PostSerializer < ActiveModel::Serializer
686
707
  embed :ids, include: true
687
708
 
688
709
  attributes :id, :title, :body
689
- has_many :comments, embed_key: :external_id
710
+ has_many :comments, key: :external_id
690
711
  end
691
712
  ```
692
713
 
@@ -714,6 +735,78 @@ data looking for information, is extremely useful.
714
735
  If you are mostly working with the data in simple scenarios and manually making
715
736
  Ajax requests, you probably just want to use the default embedded behavior.
716
737
 
738
+
739
+ ## Embedding Polymorphic Associations
740
+
741
+ Because we need both the id and the type to be able to identify a polymorphic associated model, these are serialized in a slightly different format than common ones.
742
+
743
+ When embedding entire objects:
744
+
745
+ ```ruby
746
+ class PostSerializer < ActiveModel::Serializer
747
+ attributes :id, :title
748
+ has_many :attachments, polymorphic: true
749
+ end
750
+ ```
751
+
752
+ ```json
753
+ {
754
+ "post": {
755
+ "id": 1,
756
+ "title": "New post",
757
+ "attachments": [
758
+ {
759
+ "type": "image",
760
+ "image": {
761
+ "id": 3,
762
+ "name": "logo",
763
+ "url": "http://images.com/logo.jpg"
764
+ }
765
+ },
766
+ {
767
+ "type": "video",
768
+ "video": {
769
+ "id": 12,
770
+ "uid": "XCSSMDFWW",
771
+ "source": "youtube"
772
+ }
773
+ }
774
+ ]
775
+ }
776
+ }
777
+ ```
778
+
779
+ When embedding ids:
780
+
781
+ ```ruby
782
+ class PostSerializer < ActiveModel::Serializer
783
+ embed :ids
784
+
785
+ attributes :id, :title
786
+ has_many :attachments, polymorphic: true
787
+ end
788
+ ```
789
+
790
+ ```json
791
+ {
792
+ "post": {
793
+ "id": 1,
794
+ "title": "New post",
795
+ "attachment_ids": [
796
+ {
797
+ "type": "image",
798
+ "id": 12
799
+ },
800
+ {
801
+ "type": "video",
802
+ "id": 3
803
+ }
804
+ ]
805
+ }
806
+ }
807
+ ```
808
+
809
+
717
810
  ## Customizing Scope
718
811
 
719
812
  In a serializer, `current_user` is the current authorization scope which the controller
@@ -839,7 +932,7 @@ now generates:
839
932
  class PostSerializer < ApplicationSerializer
840
933
  attributes :id
841
934
  end
842
- ````
935
+ ```
843
936
 
844
937
  # Design and Implementation Guidelines
845
938
 
@@ -45,18 +45,40 @@ module ActionController
45
45
  end
46
46
  end
47
47
 
48
- def _render_option_json(resource, options)
49
- serializer = build_json_serializer(resource, options)
48
+ [:_render_option_json, :_render_with_renderer_json].each do |renderer_method|
49
+ define_method renderer_method do |resource, options|
50
+ serializer = build_json_serializer(resource, options)
50
51
 
51
- if serializer
52
- super(serializer, options)
53
- else
54
- super
52
+ if serializer
53
+ super(serializer, options)
54
+ else
55
+ super(resource, options)
56
+ end
55
57
  end
56
58
  end
57
59
 
58
60
  private
59
61
 
62
+ def namespace_for_serializer
63
+ @namespace_for_serializer ||= namespace_for_class(self.class) unless namespace_for_class(self.class) == Object
64
+ end
65
+
66
+ def namespace_for_class(klass)
67
+ if Module.method_defined?(:module_parent)
68
+ klass.module_parent
69
+ else
70
+ klass.parent
71
+ end
72
+ end
73
+
74
+ def default_serializer(resource)
75
+ options = {}.tap do |o|
76
+ o[:namespace] = namespace_for_serializer if namespace_for_serializer
77
+ end
78
+
79
+ ActiveModel::Serializer.serializer_for(resource, options)
80
+ end
81
+
60
82
  def default_serializer_options
61
83
  {}
62
84
  end
@@ -68,10 +90,15 @@ module ActionController
68
90
 
69
91
  def build_json_serializer(resource, options = {})
70
92
  options = default_serializer_options.merge(options)
93
+ @namespace_for_serializer = options.fetch(:namespace, nil)
71
94
 
72
- if serializer = options.fetch(:serializer, ActiveModel::Serializer.serializer_for(resource))
95
+ if serializer = options.fetch(:serializer, default_serializer(resource))
73
96
  options[:scope] = serialization_scope unless options.has_key?(:scope)
74
- options[:resource_name] = controller_name if resource.respond_to?(:to_ary)
97
+
98
+ if resource.respond_to?(:to_ary)
99
+ options[:resource_name] = controller_name
100
+ options[:namespace] = namespace_for_serializer if namespace_for_serializer
101
+ end
75
102
 
76
103
  serializer.new(resource, options)
77
104
  end
@@ -3,11 +3,11 @@ module ActionController
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- setup :setup_subscriptions
7
- teardown :teardown_subscriptions
6
+ setup :setup_serialization_subscriptions
7
+ teardown :teardown_serialization_subscriptions
8
8
  end
9
9
 
10
- def setup_subscriptions
10
+ def setup_serialization_subscriptions
11
11
  @serializers = Hash.new(0)
12
12
 
13
13
  ActiveSupport::Notifications.subscribe("!serialize.active_model_serializers") do |name, start, finish, id, payload|
@@ -16,7 +16,7 @@ module ActionController
16
16
  end
17
17
  end
18
18
 
19
- def teardown_subscriptions
19
+ def teardown_serialization_subscriptions
20
20
  ActiveSupport::Notifications.unsubscribe("!serialize.active_model_serializers")
21
21
  end
22
22