From d450ac4459165e3af6e45798a6afeac1876f3bc4 Mon Sep 17 00:00:00 2001 From: Rick Olson Date: Tue, 1 Apr 2008 20:09:45 +0000 Subject: Tweak ActiveRecord::Base#to_json to include a root value in the returned hash: {post: {title: ...}} [rick] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9202 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 6 ++++++ .../active_record/serializers/json_serializer.rb | 17 ++++++++++++++- activerecord/test/cases/json_serialization_test.rb | 25 ++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) (limited to 'activerecord') diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 069d6a3841..2d13ca8deb 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,11 @@ *SVN* +* Tweak ActiveRecord::Base#to_json to include a root value in the returned hash: {"post": {"title": ...}} [rick] + + Post.find(1).to_json # => {"title": ...} + config.active_record.include_root_in_json = true + Post.find(1).to_json # => {"post": {"title": ...}} + * Add efficient #include? to AssociationCollection (for has_many/has_many :through/habtm). [stopdropandrew] * PostgreSQL: create_ and drop_database support. #9042 [ez, pedz, nicksieger] diff --git a/activerecord/lib/active_record/serializers/json_serializer.rb b/activerecord/lib/active_record/serializers/json_serializer.rb index c0a5850d5d..d024adba39 100644 --- a/activerecord/lib/active_record/serializers/json_serializer.rb +++ b/activerecord/lib/active_record/serializers/json_serializer.rb @@ -1,5 +1,10 @@ module ActiveRecord #:nodoc: module Serialization + def self.included(base) + base.cattr_accessor :include_root_in_json, :instance_writer => false + base.extend ClassMethods + end + # Returns a JSON string representing the model. Some configuration is # available through +options+. # @@ -48,7 +53,11 @@ module ActiveRecord #:nodoc: # {"comments": [{"body": "Don't think too hard"}], # "title": "So I was thinking"}]} def to_json(options = {}) - JsonSerializer.new(self, options).to_s + if include_root_in_json + "{#{self.class.json_class_name}: #{JsonSerializer.new(self, options).to_s}}" + else + JsonSerializer.new(self, options).to_s + end end def from_json(json) @@ -61,5 +70,11 @@ module ActiveRecord #:nodoc: serializable_record.to_json end end + + module ClassMethods + def json_class_name + @json_class_name ||= name.demodulize.underscore.inspect + end + end end end diff --git a/activerecord/test/cases/json_serialization_test.rb b/activerecord/test/cases/json_serialization_test.rb index c4597a110d..3446e5e7f0 100644 --- a/activerecord/test/cases/json_serialization_test.rb +++ b/activerecord/test/cases/json_serialization_test.rb @@ -7,6 +7,10 @@ require 'models/tag' require 'models/comment' class JsonSerializationTest < ActiveRecord::TestCase + class NamespacedContact < Contact + column :name, :string + end + def setup @contact = Contact.new( :name => 'Konata Izumi', @@ -18,6 +22,27 @@ class JsonSerializationTest < ActiveRecord::TestCase ) end + def test_should_demodulize_root_in_json + NamespacedContact.include_root_in_json = true + @contact = NamespacedContact.new :name => 'whatever' + json = @contact.to_json + assert_match %r{^\{"namespaced_contact": \{}, json + end + + def test_should_include_root_in_json + Contact.include_root_in_json = true + json = @contact.to_json + + assert_match %r{^\{"contact": \{}, json + assert_match %r{"name": "Konata Izumi"}, json + assert_match %r{"age": 16}, json + assert json.include?(%("created_at": #{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) + assert_match %r{"awesome": true}, json + assert_match %r{"preferences": \{"shows": "anime"\}}, json + ensure + Contact.include_root_in_json = false + end + def test_should_encode_all_encodable_attributes json = @contact.to_json -- cgit v1.2.3