mirror of
https://github.com/github/rails.git
synced 2026-01-10 07:07:54 -05:00
Added support for using classes from within a single nested module [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6587 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,20 @@
|
||||
*SVN*
|
||||
|
||||
* Added support for using classes from within a single nested module [DHH]. Example:
|
||||
|
||||
module Highrise
|
||||
class Note < ActiveResource::Base
|
||||
self.site = "http://37s.sunrise.i:3000"
|
||||
end
|
||||
|
||||
class Comment < ActiveResource::Base
|
||||
self.site = "http://37s.sunrise.i:3000"
|
||||
end
|
||||
end
|
||||
|
||||
assert_kind_of Highrise::Comment, Note.find(1).comments.first
|
||||
|
||||
|
||||
* Added load_attributes_from_response as a way of loading attributes from other responses than just create [DHH]
|
||||
|
||||
class Highrise::Task < ActiveResource::Base
|
||||
|
||||
@@ -112,8 +112,11 @@ module ActiveResource
|
||||
returning(self.new(attributes)) { |res| res.save }
|
||||
end
|
||||
|
||||
# Core method for finding resources. Used similarly to ActiveRecord's find method.
|
||||
# Person.find(1) # => GET /people/1.xml
|
||||
# Core method for finding resources. Used similarly to Active Record's find method.
|
||||
# Person.find(1) # => GET /people/1.xml
|
||||
# Person.find(:all) # => GET /people.xml
|
||||
# Person.find(:all, :title => "CEO") # => GET /people.xml?title=CEO
|
||||
# Person.find(:managers) # => GET /people/managers.xml
|
||||
# StreetAddress.find(1, :person_id => 1) # => GET /people/1/street_addresses/1.xml
|
||||
def find(*arguments)
|
||||
scope = arguments.slice!(0)
|
||||
@@ -290,7 +293,9 @@ module ActiveResource
|
||||
|
||||
# Update the resource on the remote service.
|
||||
def update
|
||||
connection.put(element_path(prefix_options), to_xml)
|
||||
returning connection.put(element_path(prefix_options), to_xml) do |response|
|
||||
load_attributes_from_response(response)
|
||||
end
|
||||
end
|
||||
|
||||
# Create (i.e., save to the remote service) the new resource.
|
||||
@@ -329,7 +334,13 @@ module ActiveResource
|
||||
# Tries to find a resource for a given name; if it fails, then the resource is created
|
||||
def find_or_create_resource_for(name)
|
||||
resource_name = name.to_s.camelize
|
||||
self.class.const_get(resource_name)
|
||||
|
||||
# FIXME: Make it generic enough to support any depth of module nesting
|
||||
if (ancestors = self.class.name.split("::")).size > 1
|
||||
ancestors.first.constantize.const_get(resource_name)
|
||||
else
|
||||
self.class.const_get(resource_name)
|
||||
end
|
||||
rescue NameError
|
||||
resource = self.class.const_set(resource_name, Class.new(ActiveResource::Base))
|
||||
resource.prefix = self.class.prefix
|
||||
|
||||
@@ -2,6 +2,17 @@ require "#{File.dirname(__FILE__)}/../abstract_unit"
|
||||
require "fixtures/person"
|
||||
require "fixtures/street_address"
|
||||
|
||||
module Highrise
|
||||
class Note < ActiveResource::Base
|
||||
self.site = "http://37s.sunrise.i:3000"
|
||||
end
|
||||
|
||||
class Comment < ActiveResource::Base
|
||||
self.site = "http://37s.sunrise.i:3000"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class BaseLoadTest < Test::Unit::TestCase
|
||||
def setup
|
||||
@matz = { :id => 1, :name => 'Matz' }
|
||||
@@ -92,4 +103,9 @@ class BaseLoadTest < Test::Unit::TestCase
|
||||
assert_equal @deep[:street][:state][:notable_rivers].first[:id], rivers.first.id
|
||||
assert_equal @matz[:id], rivers.last.rafted_by.id
|
||||
end
|
||||
end
|
||||
|
||||
def test_nested_collections_within_the_same_namespace
|
||||
n = Highrise::Note.new(:comments => [{ :name => "1" }])
|
||||
assert_kind_of Highrise::Comment, n.comments.first
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user