3 Stimmen

Grundlegende Frage zu Rails: Daten über mehrere Seiten aufbauen

Alle Rails-Expertenseiten sagen, dass man ActiveRecords nicht in der Session speichern soll. Ich habe jedoch ein ActiveRecord-Objekt mit mehreren Feldern, das sich über mehrere Seiten erstreckt. Der Code, den ich versuche zu bereinigen, verwendet versteckte Felder, um die Daten weiterzugeben, die wie eine schlechte Idee scheint (Benutzer kann für eine Sache zu manipulieren). Was ist die typische, oder gute, Weise zu teilen, eine Modell-Füllung Seite in mehrere Seiten?

Hinweis: Ich könnte den ActiveRecord in der DB speichern und dann erhalten Sie es mit der ID, die ich in Sitzung speichern... das Problem ist, dass der ActiveRecord mehrere Validierungen hat, die es nicht ohne alle Daten speichern lassen. Ich könnte die Parameter selbst in der Sitzung speichern, oder etwas.... muss es einen Standardweg, dies zu tun...

5voto

Tor Erik Linnerud Punkte 436

Wir verwenden das folgende Muster, das gut zu funktionieren scheint.

  1. Fügen Sie dem Modell einen Attribut-Accessor namens wizard_stage hinzu:

    attr_accessor :wizard_stage

  2. Fügen Sie ein verstecktes Feld :wizard_stage in das Formular für den Datensatz auf jeder Seite ein. Setzen Sie den Wert des Feldes auf etwas, das die Funktion der Seite widerspiegelt, z. B:

    f.hidden_field :wizard_stage, :value => 'kontakt_details'

  3. Fügen Sie in der Modellvalidierung eine Bedingung wie die folgende hinzu:

    validiert ... :if => lambda{|m| m.wizard_stage == 'contact_details'}

Nun kann der Datensatz für jede Einreichung gespeichert werden, wobei nach und nach weitere Attribute hinzugefügt werden.

Beachten Sie, dass dies einem Angreifer erlaubt, die Validierung zu umgehen, wenn er will, aber in unserem Fall (in den meisten Fällen?) spielt das keine große Rolle.

2voto

Ryan Oberoi Punkte 12977

Konvertieren Sie das/die Objekt(e) mit obj.to_yaml in yaml und speichern Sie das yaml als Text in der Datenbank (oder sogar in einer flachen Datei). Speichern Sie die ID in der Sitzung. Laden Sie sie bei Bedarf erneut. obj.to_yaml serialisiert das Objekt, ohne dass es gespeichert werden muss, und überspringt die Validierung von rails activerecord.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X