2009-10-16 12 views
10

Mam kontroler z następującą logiką układuRuby on Rails układy ... z wyjątkiem i tylko bug

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

Problem jest, że Rails wydaje się ignorować pierwszą linię kodu i układ „sesji” jest nie dotyczy żadnych działań. Po prostu myśli, aby uczynić układ statyczny dla prywatności i bez układu dla reszty.

Ktoś wie, jak to naprawić?

Odpowiedz

10

Inną opcją jest określenie sposobu rozmowy układu, tak jak poniżej:

layout :compute_layout 

a następnie

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

jednak jest to naprawdę tylko przydatne, gdy chcesz dete Wyświetlaj układ w środowisku wykonawczym na podstawie pewnego parametru środowiska wykonawczego (jak ustawiana zmienna). W twoim przykładzie nie wydaje się to konieczne.

+0

to jest to, do czego uciekłem się ... +1 dla "action_name" ... nie wiedziałem o tym – Tony

+0

nazwa_czynności jest również łatwo wrzucić do sprawy/kiedy/potem zablokować, gdy masz do czynienia z więcej niż 2 działania. – Jared

2

Możesz podać tylko layout :static tam, gdzie jest to potrzebne.

23

Powodem, dla którego to nie działa, jest to, że możesz mieć tylko deklarację jednego układu na jeden kontroler. Warunki :only i :except tylko rozróżniają działania, które powinny uzyskać określony układ, a te, które są wykluczone, są renderowane bez układu. Innymi słowy, deklaracja układu zawsze dotyczy wszystkich działań, które używają renderowania domyślnego.

Aby zastąpić po prostu określić układ podczas renderowania jak jeden z poniższych przykładów wewnątrz działania:

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

Jest to znacznie lepsze rozwiązanie niż rozwiązanie przyjęte w opisywanym przypadku. –