Ich verwende eine hässliche Muster in meinem Code und ich weiß, es muss eine bessere Möglichkeit, dies zu tun. Hilf mir zu überdenken, was ich tue.Übergeben von Daten zwischen den Controllern mit der Sitzung RESTvoll
Meine Website ist eine Art Diskussionsforum. Alle Antworten auf Diskussionen werden auf der DiscussionsController # show-Seite inline ausgeführt.
Einige Antworten sind jedoch ungültig. Wenn Sie beispielsweise versuchen, eine Antwort ohne Text einzugeben, werden Sie mit einer Fehlermeldung an DisconsualsController # show zurückgegeben.
Hier ist ein kurzer Überblick, wie ich diesen Workflow implementiert haben:
- Benutzer geht zu DiscussionsController # show. Diese Vorlage hat ein Antwortformular darauf. Es gibt keine explizite RepliesController # neue Aktion.
- Der Benutzer sendet ein Antwortformular, das an replys_path gesendet und in RepliesController # create behandelt wird.
- AntwortenController # create kann die Antwort nicht speichern, da sie ungültig ist (validates_length_of in Reply deaktiviert das Objekt).
- AntwortenController # create stellt das Antwortobjekt in die Sitzung [: new_reply] und leitet den Diskussionspfad weiter, von dem der Benutzer kam.
- DiscussionsController # show behandelt das Sitzungsobjekt ...
Wie so:
if session[:new_reply]
@new_reply = session[:new_reply]
session.delete(:new_reply)
end
Und jetzt hat show.html.erb ein neu regenerierten @new_reply Objekt auf Fehler zu überprüfen.
Da ist etwas offensichtlich falsch - Sie sollten nicht ganze Objekte innerhalb der Sitzung speichern. Aber da das Reply-Objekt, das wir in RepliesController # create speichern wollten, nie gespeichert wurde, wie behalte ich es zwischen Controller-Aktionsaufrufen?
Oder wenn es eine größere Design-Lösung gibt, zögern Sie nicht, es zu teilen. Das ist so hässlich, dass es mir weh tut. Vielen Dank.
Ich mache diese Art von Dingen so. Stellen Sie sicher, dass Sie @discussion und @reply geladen haben. – klew
Ich dachte daran, aber es gibt zwei Gründe, warum ich den Render-Ansatz nicht mag: 1. Es ändert die URL; Ich möchte die Illusion behalten, dass du immer noch auf derselben Seite bist (weil du es bist). 2. Ich mag wirklich nicht die Tatsache, dass ich die Logik in DiscussionsController # show kopieren müsste - stelle sicher, dass die gleichen Filter angewendet werden, und stelle sicher, dass @discussion und andere Instanzvariablen auf dieselbe Weise ausgewählt werden (benutzerdefinierte Funde) mit Bedingungen, etc.) - scheint nicht sehr trocken. – Raphomet