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 vonPOST
Dazu 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.