Ответ JSON с использованием HTTPPARTy всегда возвращает 200

Я отправляю запрос к моему API рельсов через объект HttpParty:

 HTTParty.get(task_list_url(@hotel_id),
        :headers => { 'X-User-Email' => @user_email, 'X-User-Token'=> @user_token, 'Content-Type' => 'application/json' }
      )

Я храню этот объект в переменной @response

Метод на API выглядит примерно так

  def index
    @tasks = policy_scope(Task).where(hotel: @hotel)
    if current_user.created_account == @hotel.account || current_user.hotels.include?(@hotel)
      render json: {tasks: @tasks, hotel: @hotel}
    else
      render json: {
         :status => :unauthorized,
         :message => "unauthorized"
      }
    end
  end

Проблема в том, что в противном случае возвращаемый @response выглядит так:

#<HTTParty::Response:0x7fbb0a580198 parsed_response={"status"=>"unauthorized", "message"=>"unauthorized"}, @response=#<Net::HTTPOK 200 OK readbody=true>, @headers={"x-frame-options"=>["SAMEORIGIN"], "x-xss-protection"=>["1; mode=block"], "x-content-type-options"=>["nosniff"], "access-control-allow-origin"=>["*"], "access-control-allow-methods"=>["POST, GET, PUT, DELETE, OPTIONS"], "access-control-allow-headers"=>["Origin, Content-Type, Accept, Authorization, Token"], "access-control-max-age"=>["1728000"], "content-type"=>["application/json; charset=utf-8"], "etag"=>["W/\"2cd59ce00f09c29553693183e9a04a4d\""], "cache-control"=>["max-age=0, private, must-revalidate"], "x-request-id"=>["5acc353c-48aa-410d-a4bc-888c653cae02"], "x-runtime"=>["0.459027"], "vary"=>["Origin"], "connection"=>["close"], "transfer-encoding"=>["chunked"]}>

соответствующая информация находится не в @response, как вы можете видеть, а в parsed_response. Это создает проблему в моем клиентском приложении, потому что я проверяю @response, который возвращает OK 200, тогда как правильный возврат должен быть UNAUTHORIZED 401.

Как я могу поместить свой правильный json-ответ в объект @response или, если это невозможно, как выполнить проверку parsed_response внутри объекта HTTParty.


person David Geismar    schedule 22.04.2016    source источник


Ответы (1)


Эта небольшая коррекция контроллера должна помочь.

Вместо:

render json: {
     :status => :unauthorized,
     :message => "unauthorized"
  }

Использовать этот:

render json: { message: "unauthorized" }, status: :unauthorized
person Maxim Pontyushenko    schedule 22.04.2016