2009-10-16 4 views
10

ich einen Controller mit dem folgenden Layout LogikRuby on Rails-Layouts ... außer und nur Fehler

layout 'sessions', :except => :privacy 
    layout 'static', :only => :privacy 

Das Problem ist, dass Rails scheint die erste Zeile des Codes und die Layout „Sitzungen“ zu ignorieren nicht für irgendwelche Aktionen angewendet. Es denkt einfach daran, das statische Layout für die Privatsphäre zu rendern und für den Rest kein Layout.

Wer weiß, wie man das beheben kann?

Antwort

10

Eine weitere Möglichkeit, eine Methode für Ihr Layout Aufruf zu definieren, etwa so:

layout :compute_layout 

und dann

def compute_layout 
    action_name == "privacy" ? "static" : "sessions" 
end 

dies ist jedoch nur sinnvoll, wenn Sie DeTe wollen Das Layout zur Laufzeit basierend auf einigen Laufzeitparametern definieren (wie eine Variable). In Ihrem Beispiel scheint das nicht notwendig zu sein.

+0

das ist, worauf ich mich gewendet habe ... +1 für den "action_name" ... wusste nicht, dass – Tony

+0

action_name ist auch einfach in einen Fall zu werfen/wenn/dann blockieren, wenn Sie mit mehr als 2 zu tun haben Aktionen. – Jared

2

Sie können einfach layout :static angeben, wo Sie es brauchen.

23

Der Grund, warum dies nicht funktioniert, ist, weil Sie nur eine globale Layout-Deklaration pro Controller haben können. Die :only und :except Bedingungen unterscheiden nur zwischen Aktionen, die das angegebene Layout erhalten sollen, und die ausgeschlossenen werden ohne Layout gerendert. Mit anderen Worten, eine Layout-Deklaration wirkt sich immer auf alle Aktionen aus, die das Standard-Rendering verwenden.

außer Kraft zu setzen Sie einfach ein Layout angeben, wenn Sie wie einer der folgenden Beispiele innerhalb einer Aktion machen: ist

render :layout => 'static' 
render :action => 'privacy', :layout => 'static' 
render :layout => false # Don't render a layout 
+3

Dies ist eine viel bessere Lösung als die für den beschriebenen Fall akzeptiert. –