Rails respond_with: ¿por qué POST devuelve una URL en lugar de los datos?

Esta es una pregunta "por qué funciona de esta manera", no "cómo puedo hacer que esto funcione".

Mi aplicación está llamando a una API REST de terceros que devuelve JSON y devuelve el resultado como parte de mipropio API JSON.

Yo estaba usando los rieles 3respond_to yrespond_with metodos En el caso deGET solicitudes, esto funciona como espero, solo pasando por el JSON.

En el caso dePOST, hace más, incluyendo hacer una URL desde el objeto devuelto para pasar en un:location opción. Pero como mi objeto es solo JSON (no ActiveRecord), recibo un error.

Por ejemplo...

# 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 

Mi envoltorio para la API de terceros hace una solicitud POST, que vuelve bien, luego Rails devuelve un error 500 que se registra de esta manera:

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

Rails quiere que mi objeto @products sepa cómo crear una URL de ubicación.

ACLARACIÓN: La@products El objeto devuelto por la API de terceros es JSON puro, una cadena, que puede ver incrustada en el mensaje de registro de errores anterior. Este error se está produciendo porque Rails parece querer que el objeto sea algo más: en el soporte de API interno de Rails, es un objeto ActiveRecord.

Si sustituyo el nuevorespond_with con sytax con el viejo estilo

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

entonces todo funciona. Y esto es lo que he hecho, así que no tengo un problema de "cómo", sino una pregunta de "por qué".

Publicación de Ryan Daigle En la introducción se explica que se espera lo que está sucediendo.

Mi pregunta es:por qué hacerespond_with esperar algo más que datos (y el estado HTTP?), y aparentemente solo paraPOST.

No estoy diciendo que esté mal, solotratando de entender El fundamento de la implementación de Rails.

Respuestas a la pregunta(3)

Su respuesta a la pregunta