diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 9aae21e8..32a3abfa 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -201,6 +201,9 @@ module ActiveModel # methods, provided by default by ActiveRecord. You can implement these # methods on your custom models if you want the serializer's schema method # to work. + # + # TODO: This is currently coupled to Active Record. We need to + # figure out a way to decouple those two. def schema klass = model_class columns = klass.columns_hash @@ -241,7 +244,6 @@ module ActiveModel def inherited(klass) #:nodoc: return if klass.anonymous? - name = klass.name.demodulize.underscore.sub(/_serializer$/, '') klass.class_eval do @@ -260,8 +262,9 @@ module ActiveModel # Returns a json representation of the serializable # object including the root. - def as_json(*) - if root = @options[:root] || _root + def as_json(options=nil) + options ||= {} + if root = options.fetch(:root, @options.fetch(:root, _root)) @hash = hash = {} hash.merge!(root => serializable_hash) hash diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 44a340c1..6bbc7d33 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -703,7 +703,19 @@ class SerializerTest < ActiveModel::TestCase author = author_class.new(:id => 5, :name => "Tom Dale") post.author = author - hash = serializer_class.new(post, nil, :root => :blog_post) + assert_equal({ + :blog_post => { + :title => "New Post", + :body => "It's a new post!", + :author => { :id => 5, :name => "Tom Dale" } + } + }, serializer_class.new(post, nil, :root => :blog_post).as_json) + + assert_equal({ + :title => "New Post", + :body => "It's a new post!", + :author => { :id => 5, :name => "Tom Dale" } + }, serializer_class.new(post, nil, :root => false).as_json) assert_equal({ :blog_post => { @@ -711,7 +723,13 @@ class SerializerTest < ActiveModel::TestCase :body => "It's a new post!", :author => { :id => 5, :name => "Tom Dale" } } - }, hash.as_json) + }, serializer_class.new(post, nil).as_json(:root => :blog_post)) + + assert_equal({ + :title => "New Post", + :body => "It's a new post!", + :author => { :id => 5, :name => "Tom Dale" } + }, serializer_class.new(post, nil).as_json(:root => false)) end def test_serializer_has_access_to_root_object