2010-12-16 19 views
0

Ich habe @sort_by Attribut auf meinen Controller und initialisiert es Wert wie folgt ist:Rails: Warum wird das Standardanwendungslayout nicht verwendet?

class ProductsController < ApplicationController 
    def initialize 
    @sort_by = :shop_brand 
    end 
    ... 
end 

Diese die Standardanwendung Layout verursachte nicht verwendet werden.

Warum?

Was ist der richtige Weg, um einem Controller ein Attribut hinzuzufügen und es zu initialisieren?

Antwort

6

Das Überschreiben des Konstruktors ist wahrscheinlich eine schlechte Idee (wie Sie gefunden haben). Sie sollten ein before_filter verwenden:

class ProductsController < ApplicationController 

    before_filter :set_defaults 

    ... 

    private 

    def set_defaults 
    @sort_by = :shop_brand 
    end 

end 

aber es klingt wie Sie Zustand halten wollen. Am einfachsten ist es in der Sitzung des Benutzers zu speichern, die automatisch pro Benutzer bestehen bleiben wird, bis sie den Browser zu schließen:

def set_defaults 
    session[:sort_by] ||= :shop_brand 
end 

Die andere Option wäre die aktuelle sort_by Wert in der URL zu übergeben. Dies ist jedoch schwieriger zu implementieren, da Sie sicherstellen müssen, dass jeder Link oder jedes Formular den Wert für die nächste Anforderung kopiert. Der Vorteil davon ist jedoch, dass der Benutzer mehrere Registerkarten mit verschiedenen Ordnungen geöffnet haben könnte und jeder Lesezeichen-Link die gleiche Reihenfolge beim nächsten Mal wiederherstellen würde. Dies ist der Ansatz, den Dinge wie Suchmaschinen verwenden würden.

+0

Und wenn 'sort_by' sich nie ändern wird, funktioniert es wahrscheinlich besser als eine Konstante' SortBy' an der Basis der Klasse :) – Matchu

+0

'sort_by' kann geändert werden, also kann es keine Konstante sein. Außerdem wird in Ihrem Code '@ sort_by' vor jeder Aktion gesetzt, aber ich möchte den Standardwert (': shop_brand') nur einmal setzen! Ich möchte nicht den Standardwert jedes Mal, wenn die 'index' Methode aufgerufen wird, setzen! –

+0

Nun, ich kann '@sort_by || =: shop_brand' machen, aber ich frage mich, ob es eine schönere Methode gibt, die 'set_defaults' nicht jedes Mal aufruft? –

Verwandte Themen