1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Reuse Active Model serialization in Active Resource. [#2584 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
This commit is contained in:
Santiago Pastorino 2010-04-26 18:27:16 -03:00 committed by Jeremy Kemper
parent 76d6a99364
commit 7cd1d37a51
2 changed files with 25 additions and 69 deletions

View file

@ -1176,73 +1176,11 @@ module ActiveResource
!new? && self.class.exists?(to_param, :params => prefix_options) !new? && self.class.exists?(to_param, :params => prefix_options)
end end
# Converts the resource to an XML string representation.
#
# ==== Options
# The +options+ parameter is handed off to the +to_xml+ method on each
# attribute, so it has the same options as the +to_xml+ methods in
# Active Support.
#
# * <tt>:indent</tt> - Set the indent level for the XML output (default is +2+).
# * <tt>:dasherize</tt> - Boolean option to determine whether or not element names should
# replace underscores with dashes (default is <tt>false</tt>).
# * <tt>:skip_instruct</tt> - Toggle skipping the +instruct!+ call on the XML builder
# that generates the XML declaration (default is <tt>false</tt>).
#
# ==== Examples
# my_group = SubsidiaryGroup.find(:first)
# my_group.to_xml
# # => <?xml version="1.0" encoding="UTF-8"?>
# # <subsidiary_group> [...] </subsidiary_group>
#
# my_group.to_xml(:dasherize => true)
# # => <?xml version="1.0" encoding="UTF-8"?>
# # <subsidiary-group> [...] </subsidiary-group>
#
# my_group.to_xml(:skip_instruct => true)
# # => <subsidiary_group> [...] </subsidiary_group>
def to_xml(options={})
attributes.to_xml({:root => self.class.element_name}.merge(options))
end
# Coerces to a hash for JSON encoding.
#
# ==== Options
# The +options+ are passed to the +to_json+ method on each
# attribute, so the same options as the +to_json+ methods in
# Active Support.
#
# * <tt>:only</tt> - Only include the specified attribute or list of
# attributes in the serialized output. Attribute names must be specified
# as strings.
# * <tt>:except</tt> - Do not include the specified attribute or list of
# attributes in the serialized output. Attribute names must be specified
# as strings.
#
# ==== Examples
# person = Person.new(:first_name => "Jim", :last_name => "Smith")
# person.to_json
# # => {"first_name": "Jim", "last_name": "Smith"}
#
# person.to_json(:only => ["first_name"])
# # => {"first_name": "Jim"}
#
# person.to_json(:except => ["first_name"])
# # => {"last_name": "Smith"}
def as_json(options = nil)
attributes.as_json(options)
end
# Returns the serialized string representation of the resource in the configured # Returns the serialized string representation of the resource in the configured
# serialization format specified in ActiveResource::Base.format. The options # serialization format specified in ActiveResource::Base.format. The options
# applicable depend on the configured encoding format. # applicable depend on the configured encoding format.
def encode(options={}) def encode(options={})
case self.class.format send("to_#{self.class.format.extension}", options)
when ActiveResource::Formats::XmlFormat
self.class.format.encode(attributes, {:root => self.class.element_name}.merge(options))
else
self.class.format.encode(attributes, options)
end
end end
# A method to \reload the attributes of this object from the remote web service. # A method to \reload the attributes of this object from the remote web service.
@ -1466,5 +1404,7 @@ module ActiveResource
class Base class Base
extend ActiveModel::Naming extend ActiveModel::Naming
include CustomMethods, Observing, Validations include CustomMethods, Observing, Validations
include ActiveModel::Serializers::JSON
include ActiveModel::Serializers::Xml
end end
end end

View file

@ -4,20 +4,22 @@ require "fixtures/customer"
require "fixtures/street_address" require "fixtures/street_address"
require "fixtures/beast" require "fixtures/beast"
require "fixtures/proxy" require "fixtures/proxy"
require 'active_support/json'
require 'active_support/core_ext/hash/conversions' require 'active_support/core_ext/hash/conversions'
require 'mocha' require 'mocha'
class BaseTest < Test::Unit::TestCase class BaseTest < Test::Unit::TestCase
def setup def setup
@matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person')
@david = { :id => 2, :name => 'David' }.to_xml(:root => 'person')
@greg = { :id => 3, :name => 'Greg' }.to_xml(:root => 'person')
@addy = { :id => 1, :street => '12345 Street', :country => 'Australia' }.to_xml(:root => 'address')
@default_request_headers = { 'Content-Type' => 'application/xml' } @default_request_headers = { 'Content-Type' => 'application/xml' }
@rick = { :name => "Rick", :age => 25 }.to_xml(:root => "person") @matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person')
@david = { :id => 2, :name => 'David' }.to_xml(:root => 'person')
@greg = { :id => 3, :name => 'Greg' }.to_xml(:root => 'person')
@addy = { :id => 1, :street => '12345 Street', :country => 'Australia' }.to_xml(:root => 'address')
@rick = { :name => "Rick", :age => 25 }.to_xml(:root => "person")
@joe = { 'person' => { :id => 6, :name => 'Joe' }}.to_json
@people = [{ :id => 1, :name => 'Matz' }, { :id => 2, :name => 'David' }].to_xml(:root => 'people') @people = [{ :id => 1, :name => 'Matz' }, { :id => 2, :name => 'David' }].to_xml(:root => 'people')
@people_david = [{ :id => 2, :name => 'David' }].to_xml(:root => 'people') @people_david = [{ :id => 2, :name => 'David' }].to_xml(:root => 'people')
@addresses = [{ :id => 1, :street => '12345 Street', :country => 'Australia' }].to_xml(:root => 'addresses') @addresses = [{ :id => 1, :street => '12345 Street', :country => 'Australia' }].to_xml(:root => 'addresses')
# - deep nested resource - # - deep nested resource -
# - Luis (Customer) # - Luis (Customer)
@ -66,6 +68,7 @@ class BaseTest < Test::Unit::TestCase
ActiveResource::HttpMock.respond_to do |mock| ActiveResource::HttpMock.respond_to do |mock|
mock.get "/people/1.xml", {}, @matz mock.get "/people/1.xml", {}, @matz
mock.get "/people/2.xml", {}, @david mock.get "/people/2.xml", {}, @david
mock.get "/people/6.json", {}, @joe
mock.get "/people/5.xml", {}, @marty mock.get "/people/5.xml", {}, @marty
mock.get "/people/Greg.xml", {}, @greg mock.get "/people/Greg.xml", {}, @greg
mock.get "/people/4.xml", {'key' => 'value'}, nil, 404 mock.get "/people/4.xml", {'key' => 'value'}, nil, 404
@ -1012,6 +1015,19 @@ class BaseTest < Test::Unit::TestCase
assert xml.include?('<id type="integer">1</id>') assert xml.include?('<id type="integer">1</id>')
end end
def test_to_json
Person.include_root_in_json = true
Person.format = :json
joe = Person.find(6)
json = joe.encode
Person.format = :xml
assert_match %r{^\{"person":\{"person":\{}, json
assert_match %r{"id":6}, json
assert_match %r{"name":"Joe"}, json
assert_match %r{\}\}\}$}, json
end
def test_to_param_quacks_like_active_record def test_to_param_quacks_like_active_record
new_person = Person.new new_person = Person.new
assert_nil new_person.to_param assert_nil new_person.to_param