Учитывая следующий контроллер в рельсах:
class AccountsController < ApplicationController
respond_to :json, :xml
def update
@account = Account.where(uuid: params[:id]).first
unless @account.nil?
if @account.update_attributes params[:account]
respond_with @account, location: account_url(@account)
else
respond_with error_hash, status: :unprocessable_entity, root: :error, location: api_account_url(@account)
end
else
respond_with error_hash, status: :not_found, root: :error, location: accounts_url
end
end
def error_hash
{ :example => "Example for this question", :parameter => 42 }
end
end
Я ожидал бы PUT
запрос/accounts/update/для выполнения следующих
- Если идентификатор существует и вызов update_attributes завершается успешно, доставьте сообщение об успешном завершении
204 (No Content)
. (У меня он установлен, чтобы вернуть @account, что было бы неплохо, но ничего страшного. 204 здесь отлично.) - Если идентификатор существует, но данные плохие, доставьте сообщение об ошибке
422 (Unprocessable Entity)
вместе с xml/json, чтобы представить ошибку. - Если идентификатор не существует, доставьте сообщение об ошибке
404 (Not Found)
вместе с xml/json, чтобы представить ошибку.
Что на самом деле происходит:
- Поставьте 204 без тела.
- Поставьте 204 без тела.
- Поставьте 204 без тела.
Почему он игнорирует мой статус и мое тело? У меня была аналогичная настройка для GET
запросов, которые работают просто отлично (правильный статус, правильное тело).
Пример CURL
request (для идентификатора, который не существует):
PUT
запрос
curl -i --header "Accept: application/xml" --header "Content-type: application/json" -X PUT -d '{"name": "whoop"}' http://localhost:3000/api/accounts/3d2cc5d0653911e2aaadc82a14fffee9 HTTP/1.1 204 No Content Location: http://localhost:3000/api/accounts X-Ua-Compatible: IE=Edge Cache-Control: no-cache X-Request-Id: bf0a02f452fbace65576aab6d2bd7c1e X-Runtime: 0.029193 Server: WEBrick/1.3.1 (Ruby/1.9.3/2013-01-15) Date: Thu, 24 Jan 2013 08:01:31 GMT Connection: close Set-Cookie: _bankshare_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRkkiJWFmNmI2MmU0MzViMmE3N2YzMDIzOTdjMDJmZDhiMzEwBjsAVA%3D%3D--133e394eb760a7fce07f1fd51349dc46c2d51626; path=/; HttpOnly
GET
запрос
curl -i --header "Accept: application/json" --header "Content-type: application/json" -X GET http://localhost:3000/api/accounts/3d2cc5d0653911e2aaadc82a14fffee9 HTTP/1.1 404 Not Found Content-Type: application/json; charset=utf-8 X-Ua-Compatible: IE=Edge Cache-Control: no-cache X-Request-Id: 9cc0d1cdfb27bb86a206cbc38cd75473 X-Runtime: 0.005118 Server: WEBrick/1.3.1 (Ruby/1.9.3/2013-01-15) Date: Thu, 24 Jan 2013 08:19:45 GMT Content-Length: 116 Connection: Keep-Alive {"friendly-status":"not-found","status":404,"message":"No account with id '3d2cc5d0653911e2aaadc82a14fffee9' found"}