aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource
diff options
context:
space:
mode:
authorJacques Crocker <railsjedi@gmail.com>2010-09-18 20:21:03 -0700
committerJosé Valim <jose.valim@gmail.com>2010-09-25 11:15:40 +0200
commitee5ef67c443407f616feef3a8cade8ba3a9d6ef0 (patch)
tree5a3adcaa9837d2638d88bd9ebbe915c98e15e2bf /activeresource
parent1b7d30bfc925562cffff10db2a0388770e9bc06c (diff)
downloadrails-ee5ef67c443407f616feef3a8cade8ba3a9d6ef0.tar.gz
rails-ee5ef67c443407f616feef3a8cade8ba3a9d6ef0.tar.bz2
rails-ee5ef67c443407f616feef3a8cade8ba3a9d6ef0.zip
Allow ActiveResource to work with non-generated ids [#5660 state:resolved]
This commit updates new? so that it knows whether or not the record was actually new or not, and doesn't rely solely on the presence of id. This enables the ability to set a custom primary_key that is not autogenerated by the server. Signed-off-by: José Valim <jose.valim@gmail.com>
Diffstat (limited to 'activeresource')
-rw-r--r--activeresource/lib/active_resource/base.rb10
-rw-r--r--activeresource/test/cases/base/custom_methods_test.rb2
-rw-r--r--activeresource/test/cases/base_test.rb49
-rw-r--r--activeresource/test/fixtures/address.rb19
-rw-r--r--activeresource/test/fixtures/subscription_plan.rb5
5 files changed, 80 insertions, 5 deletions
diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb
index 3016f62b80..915021a7b3 100644
--- a/activeresource/lib/active_resource/base.rb
+++ b/activeresource/lib/active_resource/base.rb
@@ -886,7 +886,7 @@ module ActiveResource
end
def instantiate_record(record, prefix_options = {})
- new(record).tap do |resource|
+ new(record, true).tap do |resource|
resource.prefix_options = prefix_options
end
end
@@ -959,9 +959,10 @@ module ActiveResource
#
# my_other_course = Course.new(:name => "Philosophy: Reason and Being", :lecturer => "Ralph Cling")
# my_other_course.save
- def initialize(attributes = {})
+ def initialize(attributes = {}, persisted = false)
@attributes = {}.with_indifferent_access
@prefix_options = {}
+ @persisted = persisted
load(attributes)
end
@@ -1011,7 +1012,7 @@ module ActiveResource
# is_new.new? # => false
#
def new?
- id.nil?
+ !persisted?
end
alias :new_record? :new?
@@ -1028,7 +1029,7 @@ module ActiveResource
# not_persisted.persisted? # => true
#
def persisted?
- !new?
+ @persisted
end
# Gets the <tt>\id</tt> attribute of the resource.
@@ -1317,6 +1318,7 @@ module ActiveResource
def load_attributes_from_response(response)
if !response['Content-Length'].blank? && response['Content-Length'] != "0" && !response.body.nil? && response.body.strip.size > 0
load(self.class.format.decode(response.body))
+ @persisted = true
end
end
diff --git a/activeresource/test/cases/base/custom_methods_test.rb b/activeresource/test/cases/base/custom_methods_test.rb
index 459d33c24f..0fbf94bc0e 100644
--- a/activeresource/test/cases/base/custom_methods_test.rb
+++ b/activeresource/test/cases/base/custom_methods_test.rb
@@ -91,7 +91,7 @@ class CustomMethodsTest < Test::Unit::TestCase
201, {'Location' => '/people/1/addresses/2.xml'}),
addy.post(:link)
- matz = Person.new(:id => 1, :name => 'Matz')
+ matz = Person.find(1)
assert_equal ActiveResource::Response.new(@matz, 201), matz.post(:register)
end
diff --git a/activeresource/test/cases/base_test.rb b/activeresource/test/cases/base_test.rb
index b5914683e9..b63a218663 100644
--- a/activeresource/test/cases/base_test.rb
+++ b/activeresource/test/cases/base_test.rb
@@ -5,6 +5,8 @@ require "fixtures/street_address"
require "fixtures/sound"
require "fixtures/beast"
require "fixtures/proxy"
+require "fixtures/address"
+require "fixtures/subscription_plan"
require 'active_support/json'
require 'active_support/ordered_hash'
require 'active_support/core_ext/hash/conversions'
@@ -1034,4 +1036,51 @@ class BaseTest < Test::Unit::TestCase
end
end
end
+
+ def test_with_custom_formatter
+ @addresses = [{:id => "1", :street => "1 Infinite Loop", :city => "Cupertino", :state => "CA"}].to_xml(:root => 'addresses')
+
+ ActiveResource::HttpMock.respond_to do |mock|
+ mock.get "/addresses.xml", {}, @addresses, 200
+ end
+
+ # late bind the site
+ AddressResource.site = "http://localhost"
+ addresses = AddressResource.find(:all)
+
+ assert_equal "Cupertino, CA", addresses.first.city_state
+ end
+
+ def test_create_with_custom_primary_key
+ silver_plan = {:code => "silver", :price => 5.00}.to_xml(:root => "plan")
+
+ ActiveResource::HttpMock.respond_to do |mock|
+ mock.post "/plans.xml", {}, silver_plan, 201, 'Location' => '/plans/silver.xml'
+ end
+
+ plan = SubscriptionPlan.new(:code => "silver", :price => 5.00)
+ assert plan.new?
+
+ plan.save!
+ assert !plan.new?
+ end
+
+ def test_update_with_custom_primary_key
+ silver_plan = {:code => "silver", :price => 5.00}.to_xml(:root => "plan")
+ silver_plan_updated = {:code => "silver", :price => 10.00}.to_xml(:root => "plan")
+
+ ActiveResource::HttpMock.respond_to do |mock|
+ mock.get "/plans/silver.xml", {}, silver_plan
+ mock.put "/plans/silver.xml", {}, silver_plan_updated, 201, 'Location' => '/plans/silver.xml'
+ end
+
+ plan = SubscriptionPlan.find("silver")
+ assert !plan.new?
+ assert 5.00, plan.price
+
+ # update price
+ plan.price = 10.00
+ plan.save!
+ assert 10.00, plan.price
+ end
end
diff --git a/activeresource/test/fixtures/address.rb b/activeresource/test/fixtures/address.rb
new file mode 100644
index 0000000000..fe921e1595
--- /dev/null
+++ b/activeresource/test/fixtures/address.rb
@@ -0,0 +1,19 @@
+# turns everyting into the same object
+class AddressXMLFormatter
+ include ActiveResource::Formats::XmlFormat
+
+ def decode(xml)
+ data = ActiveResource::Formats::XmlFormat.decode(xml)
+ # process address fields
+ data.each do |address|
+ address['city_state'] = "#{address['city']}, #{address['state']}"
+ end
+ data
+ end
+
+end
+
+class AddressResource < ActiveResource::Base
+ self.element_name = "address"
+ self.format = AddressXMLFormatter.new
+end \ No newline at end of file
diff --git a/activeresource/test/fixtures/subscription_plan.rb b/activeresource/test/fixtures/subscription_plan.rb
new file mode 100644
index 0000000000..e3c2dd9a74
--- /dev/null
+++ b/activeresource/test/fixtures/subscription_plan.rb
@@ -0,0 +1,5 @@
+class SubscriptionPlan < ActiveResource::Base
+ self.site = "http://37s.sunrise.i:3000"
+ self.element_name = 'plan'
+ self.primary_key = :code
+end