Rails respond_with - por que o POST retorna um URL em vez dos dados?

Esta é uma pergunta "por que funciona assim" e não "como faço isso funcionar".

Meu aplicativo está chamando uma API REST de terceiros que retorna JSON e retorna o resultado como parte do meupróprio API JSON.

Eu estava usando o Rails 3respond_to erespond_with métodos; no caso deGET solicitações, isso funciona como eu esperava, apenas passando pelo JSON.

No caso dePOST, faz mais, inclusive fazendo um URL do objeto retornado para passar em um:location opção. Mas como meu objeto é apenas JSON (não ActiveRecord), recebo um erro.

Por exemplo...

# POST /api/products.json with params id=:id
def create
  query_string = "#{user_id}&id=#{params[:id]}"
  @products = third_party_api_wrapper.products(query_string, 'POST')
  respond_with @products
end 

Meu wrapper para a API de terceiros faz uma solicitação POST, que retorna bem, então o Rails retorna um erro 500 que é registrado assim:

NoMethodError (undefined method `{"response":{"message":"product 4e1712d9ec0f257c510013f8 selected"}}_url' for #<MyController> 

Rails quer que meu objeto @products saiba como criar um URL de localização.

ESCLARECIMENTO: O@products objeto retornado pela API de terceiros é puro JSON - uma string, que você pode ver incorporada na mensagem de log de erro acima. Este erro está ocorrendo porque o Rails parece querer que o objeto seja algo mais - no suporte da API interna do Rails, ele é um objeto ActiveRecord.

Se eu substituir o novorespond_with com sytax com o estilo antigo

respond_to do |format|
  format.json { render :json => @products }  # note, no :location or :status options
end

então tudo funciona. E é isso que eu fiz, então não tenho um problema de "como", em vez disso, tenho uma pergunta "por que".

Publicação de Ryan Daigle na introdução explica que o que está acontecendo é esperado.

Minha pergunta é:porque fazrespond_with esperar algo diferente de dados (e o status HTTP?), e aparentemente apenas paraPOST.

Eu não estou dizendo que é errado, apenasTentando entender a justificativa para a implementação do Rails.

questionAnswers(3)

yourAnswerToTheQuestion