From d39a99d7705142bcfdc8d72e86ea47760bc7dbc9 Mon Sep 17 00:00:00 2001 From: Robin Daugherty Date: Sun, 12 Oct 2014 01:08:47 -0400 Subject: [PATCH 1/5] Add serialization_options Prior to 0.9, @options was used to see the options passed to to_json. For some reason, with 0.9 the options were no longer passed and were entirely inaccessible within a Serializer. This restores the access by placing it in an attribute named serializer_options. --- lib/active_model/serializable.rb | 4 ++-- lib/active_model/serializer.rb | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index 9a33d397..43950d66 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -9,11 +9,11 @@ module ActiveModel def as_json(options={}) instrument('!serialize') do if root = options.fetch(:root, json_key) - hash = { root => serializable_object } + hash = { root => serializable_object(options) } hash.merge!(serializable_data) hash else - serializable_object + serializable_object(options) end end end diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index bb0170a5..b2c7f3ad 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -273,7 +273,10 @@ end end] end + attr_accessor :serialization_options + def serializable_object(options={}) + self.serialization_options = options return @wrap_in_array ? [] : nil if @object.nil? hash = attributes hash.merge! associations From 57f1c1b1f92e276cc626b8852ce09ecc2e4b94dc Mon Sep 17 00:00:00 2001 From: Robin Daugherty Date: Sun, 12 Oct 2014 02:29:50 -0400 Subject: [PATCH 2/5] Fix serialization_options for array serialization --- lib/active_model/array_serializer.rb | 4 ++-- lib/active_model/serializable.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 91b61b6a..f15dcf05 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -38,9 +38,9 @@ module ActiveModel serializer_class.new(item, scope: scope, key_format: key_format, only: @only, except: @except, polymorphic: @polymorphic, namespace: @namespace) end - def serializable_object + def serializable_object(options) @object.map do |item| - serializer_for(item).serializable_object_with_notification + serializer_for(item).serializable_object_with_notification(options) end end alias_method :serializable_array, :serializable_object diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index 43950d66..eb689241 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -18,9 +18,9 @@ module ActiveModel end end - def serializable_object_with_notification + def serializable_object_with_notification(options) instrument('!serialize') do - serializable_object + serializable_object(options) end end From f385ab05fb3eb3deb8820e9ecd545a1337604082 Mon Sep 17 00:00:00 2001 From: Robin Daugherty Date: Sun, 12 Oct 2014 12:00:50 -0400 Subject: [PATCH 3/5] Make options param optional --- lib/active_model/array_serializer.rb | 2 +- lib/active_model/serializable.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index f15dcf05..e819de3d 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -38,7 +38,7 @@ module ActiveModel serializer_class.new(item, scope: scope, key_format: key_format, only: @only, except: @except, polymorphic: @polymorphic, namespace: @namespace) end - def serializable_object(options) + def serializable_object(options={}) @object.map do |item| serializer_for(item).serializable_object_with_notification(options) end diff --git a/lib/active_model/serializable.rb b/lib/active_model/serializable.rb index eb689241..344d8e4e 100644 --- a/lib/active_model/serializable.rb +++ b/lib/active_model/serializable.rb @@ -18,7 +18,7 @@ module ActiveModel end end - def serializable_object_with_notification(options) + def serializable_object_with_notification(options={}) instrument('!serialize') do serializable_object(options) end From 341d552ae0e664c6099a77ce7d822bca76f075e6 Mon Sep 17 00:00:00 2001 From: Robin Daugherty Date: Sun, 12 Oct 2014 13:08:29 -0400 Subject: [PATCH 4/5] Make sure serialization_options is never nil --- lib/active_model/serializer.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index b2c7f3ad..7a6ee7ca 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -273,7 +273,10 @@ end end] end - attr_accessor :serialization_options + attr_writer :serialization_options + def serialization_options + @serialization_options || {} + end def serializable_object(options={}) self.serialization_options = options From 2a1d9346f61a18dce64e603b349118029a863eb0 Mon Sep 17 00:00:00 2001 From: Robin Daugherty Date: Sun, 12 Oct 2014 19:25:38 -0400 Subject: [PATCH 5/5] Test to cover serialization_options --- .../active_model/serializer/options_test.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/unit/active_model/serializer/options_test.rb b/test/unit/active_model/serializer/options_test.rb index 986d2071..2e14151f 100644 --- a/test/unit/active_model/serializer/options_test.rb +++ b/test/unit/active_model/serializer/options_test.rb @@ -11,5 +11,24 @@ module ActiveModel assert_equal({foo: :bar}, @serializer.context) end end + + class SerializationOptionsTest < Minitest::Test + def setup + @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) + @profile_serializer = ProfileSerializer.new(@profile) + @profile_serializer.instance_eval do + def description + serialization_options[:force_the_description] + end + end + end + + def test_filtered_attributes_serialization + forced_description = "This is a test" + assert_equal({ + 'profile' => { name: 'Name 1', description: forced_description } + }, @profile_serializer.as_json(force_the_description: forced_description)) + end + end end end