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)
|
||||
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
|
||||
# serialization format specified in ActiveResource::Base.format. The options
|
||||
# applicable depend on the configured encoding format.
|
||||
def encode(options={})
|
||||
case self.class.format
|
||||
when ActiveResource::Formats::XmlFormat
|
||||
self.class.format.encode(attributes, {:root => self.class.element_name}.merge(options))
|
||||
else
|
||||
self.class.format.encode(attributes, options)
|
||||
end
|
||||
send("to_#{self.class.format.extension}", options)
|
||||
end
|
||||
|
||||
# A method to \reload the attributes of this object from the remote web service.
|
||||
|
@ -1466,5 +1404,7 @@ module ActiveResource
|
|||
class Base
|
||||
extend ActiveModel::Naming
|
||||
include CustomMethods, Observing, Validations
|
||||
include ActiveModel::Serializers::JSON
|
||||
include ActiveModel::Serializers::Xml
|
||||
end
|
||||
end
|
||||
|
|
|
@ -4,20 +4,22 @@ require "fixtures/customer"
|
|||
require "fixtures/street_address"
|
||||
require "fixtures/beast"
|
||||
require "fixtures/proxy"
|
||||
require 'active_support/json'
|
||||
require 'active_support/core_ext/hash/conversions'
|
||||
require 'mocha'
|
||||
|
||||
class BaseTest < Test::Unit::TestCase
|
||||
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' }
|
||||
@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_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 -
|
||||
# - Luis (Customer)
|
||||
|
@ -66,6 +68,7 @@ class BaseTest < Test::Unit::TestCase
|
|||
ActiveResource::HttpMock.respond_to do |mock|
|
||||
mock.get "/people/1.xml", {}, @matz
|
||||
mock.get "/people/2.xml", {}, @david
|
||||
mock.get "/people/6.json", {}, @joe
|
||||
mock.get "/people/5.xml", {}, @marty
|
||||
mock.get "/people/Greg.xml", {}, @greg
|
||||
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>')
|
||||
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
|
||||
new_person = Person.new
|
||||
assert_nil new_person.to_param
|
||||
|
|
Loading…
Reference in a new issue