Rails reply_with - Warum gibt der POST eine URL anstelle der Daten zurück?

Dies ist eine Frage "Warum funktioniert das so?", Nicht "Wie mache ich das?".

Meine App ruft eine REST-API eines Drittanbieters auf, die JSON zurückgibt, und gibt das Ergebnis als Teil von my zurückbesitzen JSON-API.

Ich habe die Rails 3 benutztrespond_to undrespond_with Methoden; Im Falle vonGET Anforderungen, dies funktioniert wie ich es erwarte, nur durch die JSON.

Im Falle vonPOSTDazu gehört auch das Erstellen einer URL aus dem zurückgegebenen Objekt für die Übergabe an:location Möglichkeit. Da mein Objekt jedoch nur JSON (nicht ActiveRecord) ist, erhalte ich eine Fehlermeldung.

Zum Beispiel...

# 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 

Mein Wrapper für die 3rd Party API sendet eine POST-Anfrage, die in Ordnung ist. Rails gibt dann einen 500-Fehler zurück, der folgendermaßen protokolliert wird:

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

Rails möchte, dass my @products weiß, wie eine Standort-URL erstellt wird.

ERKLÄRUNG: Die@products Das von der Drittanbieter-API zurückgegebene Objekt ist reines JSON - eine Zeichenfolge, die in der obigen Fehlerprotokollmeldung eingebettet ist. Dieser Fehler tritt auf, weil Rails zu wollen scheint, dass das Objekt etwas mehr ist - in der internen API-Unterstützung von Rails handelt es sich um ein ActiveRecord-Objekt.

Wenn ich das neue ersetzerespond_with mit sytax mit dem alten stil

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

dann klappt alles. Und das habe ich getan, damit ich kein "Wie" -Problem habe, sondern eine "Warum" -Frage.

Ryan Daigles Beitrag In der Einleitung wird erklärt, dass das, was passiert, erwartet wird.

Meine Frage ist:Warum tutrespond_with Erwarten Sie etwas anderes als Daten (und den HTTP-Status?) und anscheinend nur fürPOST.

Ich sage nicht, dass es falsch ist, nurversuchen zu verstehen die Begründung für die Rails-Implementierung.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage