diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index d60a50a3..69586efd 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -163,7 +163,7 @@ end end end - def associations + def associations(options={}) associations = self.class._associations included_associations = filter(associations.keys) associations.each_with_object({}) do |(name, association), hash| @@ -180,7 +180,7 @@ end if association.embed_namespace? hash = hash[association.embed_namespace] ||= {} end - hash[association.embedded_key] = serialize association + hash[association.embedded_key] = serialize association, options end end end @@ -240,8 +240,8 @@ end end end - def serialize(association) - build_serializer(association).serializable_object + def serialize(association,options={}) + build_serializer(association).serializable_object(options) end def serialize_ids(association) @@ -286,7 +286,7 @@ end self.serialization_options = options return @wrap_in_array ? [] : nil if @object.nil? hash = attributes - hash.merge! associations + hash.merge! associations(options) hash = convert_keys(hash) if key_format.present? hash = { :type => type_name(@object), type_name(@object) => hash } if @polymorphic @wrap_in_array ? [hash] : hash diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 5bdc00e8..7a9741b4 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -109,6 +109,13 @@ end class PostSerializer < ActiveModel::Serializer attributes :title, :body + def title + keyword = serialization_options[:highlight_keyword] + title = object.read_attribute_for_serialization(:title) + title = title.gsub(keyword,"'#{keyword}'") if keyword + title + end + has_many :comments end diff --git a/test/unit/active_model/serializer/has_many_test.rb b/test/unit/active_model/serializer/has_many_test.rb index c6699150..39c6e2d7 100644 --- a/test/unit/active_model/serializer/has_many_test.rb +++ b/test/unit/active_model/serializer/has_many_test.rb @@ -176,7 +176,7 @@ module ActiveModel def test_associations_embedding_objects_using_a_given_array_serializer @association.serializer_from_options = Class.new(ArraySerializer) do - def serializable_object + def serializable_object(options={}) { my_content: ['fake'] } end end diff --git a/test/unit/active_model/serializer/options_test.rb b/test/unit/active_model/serializer/options_test.rb index 2e14151f..b2c5c02e 100644 --- a/test/unit/active_model/serializer/options_test.rb +++ b/test/unit/active_model/serializer/options_test.rb @@ -21,6 +21,9 @@ module ActiveModel serialization_options[:force_the_description] end end + + @category = Category.new({name: 'Category 1'}) + @category_serializer = CategorySerializer.new(@category) end def test_filtered_attributes_serialization @@ -29,6 +32,11 @@ module ActiveModel 'profile' => { name: 'Name 1', description: forced_description } }, @profile_serializer.as_json(force_the_description: forced_description)) end + + def test_filtered_attributes_serialization_across_association + assert_equal("'T1'", + @category_serializer.as_json(highlight_keyword: 'T1')['category'][:posts][0][:title]) + end end end end