2010-09-03 12 views
6

OK, ich versuche, die Best Practices für die CREATE- und UPDATE-Methoden für HTML- und XML-Formate zu verstehen. Der Standardcode für einen Controller, den der Rails- Generator generiert, ist mir etwas unklar.Rails Best Practices für RESTful-Controller CREATE- und UPDATE-Methoden

Für die Methode CREATE, da ein guter sparen, sagt der Generator auf "redirect_to (@whatever)" für HTML und "machen: xml => @whatever,: status =>: erstellt: location = > Was auch immer "für XML.

Bei einem schlechten sparen, sagt der Generator auf "machen: action => 'new'" für HTML und "machen: xml => @ whatever.errors,: status =>: unprocessable_entity" für XML .

jedoch für die Update-Methode, ein gutes Update gegeben, sagt der Generator auf "redirect_to (@whatever)" für HTML und "Kopf: ok" für XML.

Und, da eine schlechte Update, sagt der Generator auf "machen: action => 'bearbeitet'" für HTML und "machen: xml => @ whatever.errors,: status =>: unprocessable_entity" für XML.

ich das verstehen, und es macht Sinn für mich, und funktioniert gut - ABER, ich habe zwei Fragen:

Zunächst für eine erfolgreiche Erstellen und Aktualisieren von HTML-Format, warum "redirect_to (@whatever) "statt" render: action => 'show' "? Ich verstehe die Unterschiede zwischen Redirect und Render, nur mehr neugierig darüber, auf welche Art und Weise Sie es tun und warum. Es scheint, die Weiterleitung wäre eine unnötige zusätzliche Reise für den Browser zu machen.

Zweitens, warum "Kopf: ok" nach dem erfolgreichen Update über XML, aber "machen: xml => @whatever,: status =>: erstellt: location => @whatever" bei erfolgreicher CREATE über XML? Dies scheint mir widersprüchlich zu sein. Scheint so, als ob ein erfolgreiches UPDATE via XML dasselbe wäre wie ein erfolgreiches CREATE via XML. Scheint so, als müssten Sie das neue/aktualisierte Objekt zurückgeben, damit Sie es testen können. Wie macht ihr das und warum?

Antwort

1

Ich würde dies bereits geschrieben, wenn Sam C, antwortete aber hier ist es sowieso :-)

Für den ersten Teil - warum statt machen umleiten? Zwei Gründe, die ich mir vorstellen kann:

1) Es ist konsistent. Wenn Sie die show-Aktion gerendert haben und der Benutzer die Zurück-Schaltfläche später bei der Rückkehr zu dieser Seite verwendet, wird der Benutzer unerwartetes Verhalten sehen. Einige Versionen von IE geben Ihnen eine Art von Session-Timeout-Fehler IIRC, andere Browser können es ein bisschen eleganter behandeln.

Gleiches gilt, wenn der Benutzer diese Seite mit einem Lesezeichen versehen hat und zu einem späteren Zeitpunkt mit einer GET-Anfrage zurückkehrt - die Show-Aktion wird nicht angezeigt. Ihre App kann einen Fehler auslösen oder die Indexaktion ausführen, da der Benutzer eine URL wie http://my.app.com/users anfordert, die der Indexaktion bei Verwendung einer GET-Anforderung zugeordnet würde.

2) Wenn Sie die show-Aktion ohne Umleitung auf eine GET-Anfrage rendern und der Benutzer eine Aktualisierung durchführt, sendet Ihr Browser die POST-Anfrage mit den gleichen Daten erneut und erstellt möglicherweise doppelte Instanzen von allem, was Sie erstellt haben . Der Browser warnt den Benutzer davor, damit er abbrechen kann, aber es ist möglicherweise verwirrend und eine unnötige Unannehmlichkeit.

Wie für den zweiten Teil Ihrer Frage, nicht zu sicher, um ehrlich zu sein. Meine Vermutung ist, dass Sie, da Sie das fragliche Objekt bereits aktualisieren, bereits eine Kopie davon haben, so dass keine weitere Instanz davon zurückgegeben werden muss. Allerdings könnte das Aktualisieren eines Objekts verschiedene Rückrufe auslösen, die andere Attribute des Objekts modifizieren, sodass die Rückgabe dieses aktualisierten Objekts mit diesen Änderungen sinnvoll sein könnte.

+1

Ich stimme Ihren Antworten auf den zweiten Teil meiner Frage zu. Und deine Antworten auf den ersten Teil meiner Frage machen Sinn, aber das wirft eine andere Frage auf: Warum wird nach einem erfolglosen Erstellen oder Aktualisieren Render verwendet und nicht redirect_to aus den gleichen Gründen, die du erwähnt hast? Was wäre, wenn Nutzer die Bearbeitung oder neue Seite als Lesezeichen speichern möchten? Wenn das Rendern verwendet wurde, würden sie immer noch auf der Seite "/ whatevers" sein (was falsch ist). – Buddy

+1

Wenn der Benutzer zur Aktion "new/edit" umgeleitet wurde, gingen alle übergebenen POST-Daten verloren und das gerenderte Formular wäre leer. Sie haben Recht, dass der Benutzer die gerenderte Fehlerseite als Lesezeichen speichern könnte und auf die falsche URL verweisen würde. Keine Möglichkeit, dieses AFAIK zu verhindern. – Sidane

+0

Oh ja, duh. Ich dachte fälschlicherweise, du könntest auf die neue oder bearbeitete Seite umleiten und ein @ -Objekt übergeben. Ich habe mich geirrt. Danke, dass du mich richtig gestellt hast! – Buddy

1

Bei der Erstellung oder Aktualisierung, redirect_to(@whatever), um den Beitrag zu löschen, so dass der Benutzer nicht erneut durch die Aktualisierung einreichen. Es zeigt auch die richtige URL in der Adressleiste für den Erstellungsfall an, der zum Sammelpfad (/ whatevers) sendet.

head :ok macht eine minimale Antwort auf Update, wenn Sie normalerweise das Objekt in der Dom haben würden. Wenn Sie die Seite nach einem Update aktualisieren, besteht die Standardmethode darin, rjs-Ansichten zu verwenden, um Dom-Elemente zu aktualisieren und Teiltafeln zu rendern.

+0

Ich stimme Ihren Antworten für # 1, aber ich bin nicht so sicher über # 2. Wie Sidane unten sagt, könnte das Objekt durch Rückrufe geändert werden. Aufgrund des ungewöhnlichen "ignorierenden" Standardverhaltens von update_attributes wird manchmal auch true zurückgegeben, auch wenn ungültige Schlüssel oder Werte an es übergeben werden (oder wenn einige Attribute geschützt oder schreibgeschützt sind). In diesem Fall unterscheidet sich das Objekt, das Sie im DOM hatten, davon, wie das Objekt nach dem Update wirklich im Backend aussieht. "Kopf: ok" könnte in Ordnung sein, aber zu Testzwecken denke ich, dass ich nach dem Update vielleicht eine Kopie des realen Objekts haben möchte. – Buddy

Verwandte Themen