diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index dfb86844..38608f66 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -14,6 +14,7 @@ module ActiveModel def initialize(object, options={}) @object = object + @context = options[:context] @scope = options[:scope] @root = options.fetch(:root, self.class._root) @meta_key = options[:meta_key] || :meta @@ -21,7 +22,7 @@ module ActiveModel @each_serializer = options[:each_serializer] @resource_name = options[:resource_name] end - attr_accessor :object, :scope, :root, :meta_key, :meta + attr_accessor :object, :context, :scope, :root, :meta_key, :meta def json_key if root.nil? @@ -33,7 +34,7 @@ module ActiveModel def serializer_for(item) serializer_class = @each_serializer || Serializer.serializer_for(item) || DefaultSerializer - serializer_class.new(item, scope: scope) + serializer_class.new(item, context: context, scope: scope) end def serializable_object diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index fba7fffa..cfdb7efc 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -103,13 +103,14 @@ end def initialize(object, options={}) @object = object + @context = options[:context] @scope = options[:scope] @root = options.fetch(:root, self.class._root) @meta_key = options[:meta_key] || :meta @meta = options[@meta_key] @wrap_in_array = options[:_wrap_in_array] end - attr_accessor :object, :scope, :root, :meta_key, :meta + attr_accessor :object, :context, :scope, :root, :meta_key, :meta def json_key if root == true || root.nil? @@ -166,7 +167,7 @@ end def build_serializer(association) object = send(association.name) - association.build_serializer(object, scope: scope) + association.build_serializer(object, context: context, scope: scope) end def serialize(association) diff --git a/test/unit/active_model/array_serializer/context_test.rb b/test/unit/active_model/array_serializer/context_test.rb new file mode 100644 index 00000000..437f082c --- /dev/null +++ b/test/unit/active_model/array_serializer/context_test.rb @@ -0,0 +1,19 @@ +require 'test_helper' + +module ActiveModel + class ArraySerializer + class ContextTest < ActiveModel::TestCase + def test_context_using_a_hash + serializer = ArraySerializer.new(nil, context: { a: 1, b: 2 }) + assert_equal(1, serializer.context[:a]) + assert_equal(2, serializer.context[:b]) + end + + def test_context_using_an_object + serializer = ArraySerializer.new(nil, context: Struct.new(:a, :b).new(1, 2)) + assert_equal(1, serializer.context.a) + assert_equal(2, serializer.context.b) + end + end + end +end diff --git a/test/unit/active_model/serializer/context_test.rb b/test/unit/active_model/serializer/context_test.rb new file mode 100644 index 00000000..8a2cfbfb --- /dev/null +++ b/test/unit/active_model/serializer/context_test.rb @@ -0,0 +1,19 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class ContextTest < ActiveModel::TestCase + def test_context_using_a_hash + serializer = UserSerializer.new(nil, context: { a: 1, b: 2 }) + assert_equal(1, serializer.context[:a]) + assert_equal(2, serializer.context[:b]) + end + + def test_context_using_an_object + serializer = UserSerializer.new(nil, context: Struct.new(:a, :b).new(1, 2)) + assert_equal(1, serializer.context.a) + assert_equal(2, serializer.context.b) + end + end + end +end