Wie kann ich Objekte von einem Controller zu einem anderen in Rails übergeben?

8

Ich habe versucht, rendern_to meinen Kopf zu bekommen, aber ich hatte nicht viel Erfolg.

Im Wesentlichen habe ich Controller-Methoden:

%Vor%

Was ich nicht herausfinden kann, ist, wie ich das erreichen kann. Ursprünglich wollte ich nur die Datei first.html.erb rendern, aber das schien auch nicht zu funktionieren.

Danke

Edit: Ich schätze die Antworten, die ich erhalten habe, aber alle tendieren dazu, die render-Methode oder redirect_to zu vermeiden. Ist es grundsätzlich so, dass man keine Variablen von Controller zu Controller weitergeben kann? Ich muss denken, dass es einen Weg gibt, aber ich kann es nicht finden.

    
John Baker 17.08.2009, 07:05
quelle

4 Antworten

20

Es ist keine gute Idee, das Objekt einer Konstante zuzuordnen. Wahr, dies ist in einem globalen Bereich, aber es ist global für jeden, also wird jeder andere Benutzer, der zu dieser Anfrage geht, dieses Objekt bekommen. Dafür gibt es ein paar Lösungen.

Ich gehe davon aus, dass Sie ein mehrstufiges Formular haben, das Sie durchlaufen. In diesem Fall können Sie die festgelegten Attribute als versteckte Felder übergeben.

%Vor%

Wenn es viele Felder gibt, kann das mühsam sein, deshalb sollten Sie den params[...] Hash durchlaufen oder column_names -Methode, um zu ermitteln, welche Attribute übergeben werden sollen.

Alternativ können Sie Attribute in der Sitzung speichern.

%Vor%

Drittens, wie Paul Keeble erwähnt hat, können Sie das Modell in der Datenbank speichern, aber als unvollständig markieren. Vielleicht möchten Sie dafür einen Zustandsautomaten verwenden.

Zum Schluss möchten Sie vielleicht das Plug-In für Acts als Assistenten ansehen.

    
ryanb 17.08.2009, 14:51
quelle
2

Normalerweise lassen meine Controller die Aktionen des anderen nicht aufrufen. Wenn Sie einen Bezeichner haben, der mit einem Großbuchstaben beginnt, in Ruby, der eine Konstante ist. Wenn Sie eine Instanzvariable haben möchten, beginnen Sie mit @.

%Vor%

Können Sie erklären, was Ihr Ziel ist?

    
Andy Gaskell 17.08.2009 07:20
quelle
2

Haben Sie überlegt, den Flash-Hash zu verwenden? Viele Leute verwenden es nur für Fehlermeldungen und ähnliches, es ist explizit für die Art der vorübergehenden Datenübergabe, die Sie interessieren könnten.

Grundsätzlich gibt die Flash-Methode einen Hash zurück. Jeder Wert, den Sie einem Schlüssel im Hash zuweisen, ist für die nächste Aktion verfügbar, aber dann ist er verschwunden. Also:

%Vor%     
Judson 18.08.2010 08:19
quelle
2
  1. Weg 1
              Globale Variable           (Fehler während gleichzeitiger Anfragen)
  2. Weg 2
             Klassenvariable          (Fehler während gleichzeitiger Anfragen)
  3. Weg 3

    • Speichern Sie das Objekt auf dem Server zwischen Anfragen. Der typische Weg besteht darin, sie in der Sitzung zu speichern, da sie das Objekt automatisch für Sie serialisiert / deserialisiert.
    • Serialisieren Sie das Objekt und fügen Sie es irgendwo in das Formular ein Deserialisieren Sie es von den Parametern in der nächsten Anfrage. So können Sie Attribute in der Sitzung speichern.

      %Vor%
  4. Weg 4
    Der Flash bietet eine Möglichkeit, temporäre Objekte zwischen Aktionen zu übergeben. Alles, was du in den Flash platzierst, wird der nächsten Aktion ausgesetzt und dann gelöscht.
    def first
    @item = Item.new(params[:item])
    session[:item_attributes] = @item.attributes
    end
    
    def second
    @item = Item.new(session[:item_attributes])
    @item.attributes = params[:item]
    end
    
  5. Weg 5
    Sie können den Rails-Cache verwenden.  

    %Vor% Aber was passiert, wenn verschiedene Sitzungen unterschiedliche Werte haben? Sofern Sie nicht die Eindeutigkeit des Listennamens während der gesamten Sitzung sicherstellen, schlägt diese Lösung bei gleichzeitigen Anfragen fehl
  6. Weg 6
    In einem Aktionsspeicher kann der Wert in der db-Tabelle basierend auf der Sitzungs-ID und anderen Aktionen die Datenbank basierend auf der Sitzungs-ID abrufen.

  7. Weg 7

    %Vor%
  8. Weg 8
    Von der Aktion, die gesendet wurde, um sie anzuzeigen und erneut von der Ansicht, die an andere Aktionen im Controller gesendet wurde.

praaveen 06.03.2014 07:14
quelle