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:
parent
76d6a99364
commit
7cd1d37a51
2 changed files with 25 additions and 69 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue