Skip to content

Commit

Permalink
Return a valid empty JSON on successful PUT and DELETE requests. [#5199
Browse files Browse the repository at this point in the history
… state:resolved]

Signed-off-by: José Valim <jose.valim@gmail.com>
  • Loading branch information
szimek authored and josevalim committed Oct 11, 2010
1 parent 0a8eaff commit 1556e08
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
20 changes: 20 additions & 0 deletions actionpack/lib/action_controller/metal/responder.rb
Expand Up @@ -161,6 +161,8 @@ def api_behavior(error)
display resource.errors, :status => :unprocessable_entity
elsif post?
display resource, :status => :created, :location => api_location
elsif has_empty_resource_definition?
display empty_resource, :status => :ok
else
head :ok
end
Expand Down Expand Up @@ -221,5 +223,23 @@ def has_errors?
def default_action
@action ||= ACTIONS_FOR_VERBS[request.request_method_symbol]
end

# Check whether resource needs a specific definition of empty resource to be valid
#
def has_empty_resource_definition?
respond_to?("empty_#{format}_resource")
end

# Delegate to proper empty resource method
#
def empty_resource
send("empty_#{format}_resource")
end

# Return a valid empty JSON resource
#
def empty_json_resource
"{}"
end
end
end
19 changes: 19 additions & 0 deletions actionpack/test/controller/mime_responds_test.rb
Expand Up @@ -709,6 +709,15 @@ def test_using_resource_for_put_with_xml_yields_ok_on_success
assert_equal " ", @response.body
end

def test_using_resource_for_put_with_json_yields_ok_on_success
Customer.any_instance.stubs(:to_json).returns('{"name": "David"}')
@request.accept = "application/json"
put :using_resource
assert_equal "application/json", @response.content_type
assert_equal 200, @response.status
assert_equal "{}", @response.body
end

def test_using_resource_for_put_with_xml_yields_unprocessable_entity_on_failure
@request.accept = "application/xml"
errors = { :name => :invalid }
Expand Down Expand Up @@ -739,6 +748,16 @@ def test_using_resource_for_delete_with_xml_yields_ok_on_success
assert_equal " ", @response.body
end

def test_using_resource_for_delete_with_json_yields_ok_on_success
Customer.any_instance.stubs(:to_json).returns('{"name": "David"}')
Customer.any_instance.stubs(:destroyed?).returns(true)
@request.accept = "application/json"
delete :using_resource
assert_equal "application/json", @response.content_type
assert_equal 200, @response.status
assert_equal "{}", @response.body
end

def test_using_resource_for_delete_with_html_redirects_on_failure
with_test_route_set do
errors = { :name => :invalid }
Expand Down

0 comments on commit 1556e08

Please sign in to comment.