2017-05-25 3 views
0

Ich versuche, den besten Weg zu bestimmen, Formularübergaben und Routing zu handhaben.Rails 5 Routing und Formularübergabe

Ich habe den Standard _form.html.erb sowie new.html.erb und edit.html.erb - jeder macht form, subscription = @subscription, die in der new und edit Controller deklariert Aktion.

Das Modell ist subscription, und das ist mein form Element in _form.html.erb (es im checkout Namespace ist) -

<%= form_for([:checkout, subscription]) do |f| %> 

/checkout/subscriptions/new die URL für ein neues Abonnement ist. Wenn Sie das Formular absenden, wird es an /subscriptions gesendet.

Das Problem ist, dass, wenn es Fehler gibt, und Sie den Browser aktualisieren (ich weiß, dass Benutzer dies aus dem einen oder anderen Grund tun), erhalten Sie eine Fehlermeldung, weil keine Ansicht für /subscriptions/index (ich brauche nicht ein).

Gleiches gilt für die Bearbeitung. Wenn Sie zum Beispiel (/checkout/subscriptions/14/edit) gehen, ist alles super. Aber wenn Sie das Formular senden, wird es auf /subscriptions - das gleiche Problem wie mit neuen - Wenn Sie die Seite aktualisieren, erhalten Sie die keine Ansicht Fehler. So behandelt Rails es mit einem neuen Gerüst.

Also meine Fragen sind:

  • , was die URL soll ich in dem form_for Tag verwenden?
  • Was sollte ich für das Routing tun?
  • und wie kann ich diesen Fehler beim Aktualisieren der Seite vermeiden?

Antwort

3

So funktioniert die Rails-Version von REST (und sollte funktionieren). Der Schlüssel hier ist die HTTP-Methode.

Das erneute Laden der Seite erstellt eine GET Anfrage. Während Sie Controller sollten Ressourcen mit POST erstellen und mit PATCH/PUT aktualisieren.

GET requests should be idempotent (keine Ressourcen erstellen, ändern oder löschen), also ist eine GET-Anfrage für /subscriptions oder /subscriptions/:id sehr unterschiedlich.

Was können Sie tun:

  • Verwenden Sie das window.beforeunload Ereignis in Javascript, um den Benutzer zu warnen, dass sie Daten verlieren.
  • Verlegen Sie den Pfad GET /subscriptions zu subscriptions#new.
  • Den Pfad GET /subscriptions/:id zu subscriptions#edit verlegen.
+0

Das tat es @max - danke. Es kam mir nie in den Sinn, mehrere Routen für die gleiche Controller-Aktion zu haben. – Steve

+0

Das ist eine schöne Erklärung. Freu dich auf dich. Prost! – Aashish