2010-03-01 8 views

Antwort

5

Wenn Sie den Wert über die Methoden einer gleichen Controller-Instanz dann teilen möchten, deklarieren eine Instanzvariable:

class BarsController < UsersController 

    before_filter :init_foo_list 

    def method1 
    render :method2 
    end 

    def method2 
    @foo_list.each do | item| 
     # do something 
    end 
    end 

    def init_foo_list 
    @foo_list ||= ['Money', 'Animals', 'Ummagumma'] 
    end 

end 

Wenn Sie den Wert über zwei Controller withn einer Sitzung zu teilen, dann gilt:

class BarsController < UsersController 

    before_filter :init_foo_list 

    def method1 
    render :controller => "FoosController", :action => "method2" 
    end 

    def init_foo_list 
    params[:shared_param__] ||= ['Money', 'Animals', 'Ummagumma'] 
    end  
end 

class FoosController < UsersController 

    def method2 
    params[:shared_param__].each do | item| 
     # do something 
    end 
    end 
end 

Geben Sie dem gemeinsamen Parameterschlüssel einen eindeutigen Namen, um eine Kollision mit vorhandenen Schlüsseln zu vermeiden.

Andere Option ist, das freigegebene Array in der Session-Anzeige zu speichern und es vor dem endgültigen Rendern zu löschen.

+0

attr_accessor bedeutet, dass ich auf diese Variable in der gesamten Klasseninstanz zugreifen kann. Hmm .. Ich werde es versuchen! Vielen Dank! – Antiarchitect

+0

Der erste Weg funktioniert nicht. foo_list ist null in method2 Aber die erste Methode wird vor der zweiten aufgerufen. Und wie kann ich foo_list nicht in Methoden definieren sondern initialisieren? def initialisieren self.foo_list = ['Geld', 'Tiere', 'Ummagumma'] Ende Auf diese Weise oder irgendwie anders? – Antiarchitect

+1

Stellen Sie den Wert in einem 'before_filter' ein –

6

können Sie Rails-Cache verwenden.

Rails.cache.write("list",[1,2,3]) 
Rails.cache.read("list") 
+1

Ihr Weg scheint zu funktionieren! Ich habe keine guten Dokumente für Rails.cache gefunden. Bitte geben Sie mir einen Link. – Antiarchitect

+3

Aber was passiert, wenn verschiedene Sitzungen unterschiedliche Werte haben? –

+1

Ich zweite Tony. Sofern Sie nicht die Eindeutigkeit des Namens "liste" während der gesamten Sitzung sicherstellen, schlägt diese Lösung während gleichzeitiger Anfragen fehl. –

1

Ich bin nicht sicher, ob meine Antwort auf Ihre Anforderung nahe ist, aber das ist, was ich tun, wenn ich den Wert eines Objekts/Modell erhalten möchten, die in einer Controller-Aktion und Basis auf diesem Wert abgerufen wird Ich muss andere Werte in einer anderen Controller-Aktion abrufen. Ich verwende Klassenvariablen und verwenden Sie es in meinem Controller-Aktion

für zB:

@pages=Post.find.all` 

@@[email protected](any manipulations) 

jetzt @@my_vales kann in allen möglichen Aktionen des Controllers verwendet werden ..

hoffe, es hilft ...

Verwandte Themen