From 93baaa96b19e69098579b51db2f36809cfa28522 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 5 Jul 2013 14:03:02 -0700 Subject: [PATCH] Implement meta and meta_key for AM::Serializer --- lib/active_model/serializer.rb | 16 +++++--- .../unit/active_model/serializer/meta_test.rb | 41 +++++++++++++++++++ 2 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 test/unit/active_model/serializer/meta_test.rb diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index d148860d..1e9835e5 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -28,12 +28,14 @@ module ActiveModel end def initialize(object, options={}) - @object = object - @root = options[:root] || self.class._root - @root = self.class.root_name if @root == true - @scope = options[:scope] + @object = object + @root = options[:root] || self.class._root + @root = self.class.root_name if @root == true + @scope = options[:scope] + @meta_key = options[:meta_key] || :meta + @meta = options[@meta_key] end - attr_accessor :object, :root, :scope + attr_accessor :object, :root, :scope, :meta_key, :meta alias read_attribute_for_serialization send @@ -50,7 +52,9 @@ module ActiveModel def as_json(options={}) if root = options[:root] || self.root - { root.to_s => serializable_hash } + hash = { root.to_s => serializable_hash } + hash[meta_key.to_s] = meta if meta + hash else serializable_hash end diff --git a/test/unit/active_model/serializer/meta_test.rb b/test/unit/active_model/serializer/meta_test.rb new file mode 100644 index 00000000..fdfbf584 --- /dev/null +++ b/test/unit/active_model/serializer/meta_test.rb @@ -0,0 +1,41 @@ +require 'newbase/test_helper' +require 'newbase/active_model/serializer' + + +module ActiveModel + class Serializer + class MetaTest < ActiveModel::TestCase + def setup + @model = Model.new({ :attr1 => 'value1', :attr2 => 'value2', :attr3 => 'value3' }) + end + + def test_meta + model_serializer = ModelSerializer.new(@model, root: 'model', meta: { 'total' => 10 }) + + assert_equal({ + 'model' => { + 'attr1' => 'value1', + 'attr2' => 'value2' + }, + 'meta' => { + 'total' => 10 + } + }, model_serializer.as_json) + end + + def test_meta_using_meta_key + model_serializer = ModelSerializer.new(@model, root: 'model', meta_key: :my_meta, my_meta: { 'total' => 10 }) + + assert_equal({ + 'model' => { + 'attr1' => 'value1', + 'attr2' => 'value2' + }, + 'my_meta' => { + 'total' => 10 + } + }, model_serializer.as_json) + end + end + end +end