From fd3616a46b90b10015a47b1275c1109ab836e9f3 Mon Sep 17 00:00:00 2001 From: Sean Handley Date: Fri, 19 Oct 2012 10:26:45 +0100 Subject: [PATCH] Pass the build arguments through to new_element_path. Failing to do this leads to bad requests for nested element paths so an api with self.site set to be 'foo.com/customers/:customer_id/items/:item_id' will generate the url /customers//items/new.json when Item.build is called and the API returns an error code. If we pass the attributes from build to new_element_path, this behaviour is corrected such that build calls the url: /customers/1/items/new.json --- lib/active_resource/base.rb | 2 +- test/cases/base_test.rb | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/active_resource/base.rb b/lib/active_resource/base.rb index 23cd03a4a9..174e4a214f 100644 --- a/lib/active_resource/base.rb +++ b/lib/active_resource/base.rb @@ -766,7 +766,7 @@ def collection_path(prefix_options = {}, query_options = nil) # Returns the new resource instance. # def build(attributes = {}) - attrs = self.format.decode(connection.get("#{new_element_path}", headers).body).merge(attributes) + attrs = self.format.decode(connection.get("#{new_element_path(attributes)}", headers).body) self.new(attrs) end diff --git a/test/cases/base_test.rb b/test/cases/base_test.rb index 0f13fddfd4..cdb8f653a6 100644 --- a/test/cases/base_test.rb +++ b/test/cases/base_test.rb @@ -656,6 +656,20 @@ def test_build_with_custom_header Person.headers.delete('key') end + def test_build_without_attributes_for_prefix_call + ActiveResource::HttpMock.respond_to do |mock| + mock.get "/people/1/addresses/new.json", {}, StreetAddress.new.to_json + end + assert_raise(ActiveResource::InvalidRequestError) { StreetAddress.build } + end + + def test_build_with_attributes_for_prefix_call + ActiveResource::HttpMock.respond_to do |mock| + mock.get "/people/1/addresses/new.json", {}, StreetAddress.new.to_json + end + assert_nothing_raised { StreetAddress.build(person_id: 1) } + end + def test_save rick = Person.new assert rick.save